国产精品色哟哟_男男激情3p互攻_色偷偷影院_和女同学厕所做了四次

當(dāng)前位置: 首頁 / 技術(shù)干貨 / 正文
集合泛型不匹配導(dǎo)致的ClassCastException異常解決過程

2023-01-06

泛型 類型   

  一. 代碼重現(xiàn)

  前幾天有個學(xué)生小K編寫集合代碼時,運行的結(jié)果中卻出現(xiàn)了一個自己沒見過的異常,他不知道怎么解決,于是就跑來找輝哥幫忙。下面就是小K的代碼,大家可以來看看,如下所示:

圖片 1

  上述代碼,一旦運行就會出現(xiàn)下圖中的異常現(xiàn)象。說實話,對輝哥來說,只要一遇到bug,真是瞬間感覺連吃大盤雞都不香了,必須立馬盤它才行。

圖片 2

  上圖中,我們看到了一個叫做ClassCastException類型轉(zhuǎn)換的異常!為什么會出現(xiàn)這個bug呢?其實如果我們仔細檢查一下代碼,就會發(fā)現(xiàn)原來是集合中的值寫錯了!我們聲明的集合泛型是Double類型的,結(jié)果添加數(shù)據(jù)元素的時候,給集合添加了一個整型的元素,這樣就造成了上述異常。而且根據(jù)錯誤信息的提示,異常出現(xiàn)在代碼的第40行位置,現(xiàn)在我們知道了異常的原因和位置,接下來解決就容易了。

  二. bug分析

  其實上述代碼中之所以會出現(xiàn)問題,是因為集合對泛型的嚴格要求所導(dǎo)致的。一開始小K覺著int類型可以直接轉(zhuǎn)換為double類型,所以就往集合中添加了整型數(shù)據(jù)。但實際上Java中的集合泛型,要求的必須是包裝類,我們的代碼中就是Interger和Double,所以是無法將基本類型直接轉(zhuǎn)為包裝類型的。但小K卻不明白,為什么基本類型與包裝類型兩者的類型不一致,但在往集合中添加數(shù)據(jù)時卻可以添加進去呢?為了給小K講明白這個問題,輝哥就通過javap命令帶小K查看了反編譯后的List類型,我們來看看泛型的底層究竟是個什么情況,如下圖所示:

圖片 3

  通過反編譯可以看出,集合在底層編譯時,其實所謂的泛型都被擦除了。也就是說,當(dāng)我們在使用泛型時,任何具體的類型信息都被擦除了,你唯一知道的就是你在使用一個對象。所以List和List在運行時事實上是相同的類型。而這其中原始類型的集合是特別容易出問題的,因為原始類型會跳過泛型檢查且很不安全,List、List 和 List 等存在著巨大的差異,泛型在使用中很容易造成類型擦除。那么到底什么是泛型擦除?我們繼續(xù)往下看。

  三. 泛型的擦除

  我們知道,Java泛型這個特性并不是一開始就有的,而是從JDK 1.5才開始加入的。因此Sun公司為了兼容之前的舊版本,Java對泛型的實現(xiàn)采取了“偽泛型”的策略,也就是說Java在語法上支持泛型,但在編譯階段會進行所謂的“類型擦除”(Type Erasure),將所有的泛型表示(尖括號中的內(nèi)容)都替換為具體的類型(其對應(yīng)的原生態(tài)類型),就像完全沒有泛型一樣。

  并且泛型在擦除的時候,還會根據(jù)泛型的具體類型來進行。

  四. 泛型相關(guān)知識回顧

  泛型其實就是引用類型的占位符,主要用于避免引用類型的相互轉(zhuǎn)換,替換之前使用的Object類型,去除不同類型之間的強轉(zhuǎn)。

  1. 泛型的應(yīng)用

  泛型主要可以用在 泛型類、泛型接口、泛型方法 上,也就是說,泛型可以在類、接口、方法上使用。

  2. 泛型通配符

  在泛型中,有幾個常用的通配符,我們需要掌握。

  ?:表示右邊的泛型可以是任意類型,還可以指定一個泛型的上限和下限。

  泛型上限:

  - 語法格式: 類型名稱 對象名稱

  - 語法意義: 只能接收該類型及其子類

  泛型下限:

  - 語法格式: 類型名稱 對象名稱

  - 語法意義: 只能接收該類型及其父類型

  具體用法,如下圖所示:

圖片 4

  現(xiàn)在你知道為什么會出現(xiàn)上述異常了嗎?對泛型的理解是否有進一步加深了呢?如果還有不明白的地方,可以給客服留言,客服會及時給你回復(fù)的。

好程序員公眾號

  • · 剖析行業(yè)發(fā)展趨勢
  • · 匯聚企業(yè)項目源碼

好程序員開班動態(tài)

More+
  • HTML5大前端 <高端班>

    開班時間:2021-04-12(深圳)

    開班盛況

    開班時間:2021-05-17(北京)

    開班盛況
  • 大數(shù)據(jù)+人工智能 <高端班>

    開班時間:2021-03-22(杭州)

    開班盛況

    開班時間:2021-04-26(北京)

    開班盛況
  • JavaEE分布式開發(fā) <高端班>

    開班時間:2021-05-10(北京)

    開班盛況

    開班時間:2021-02-22(北京)

    開班盛況
  • Python人工智能+數(shù)據(jù)分析 <高端班>

    開班時間:2021-07-12(北京)

    預(yù)約報名

    開班時間:2020-09-21(上海)

    開班盛況
  • 云計算開發(fā) <高端班>

    開班時間:2021-07-12(北京)

    預(yù)約報名

    開班時間:2019-07-22(北京)

    開班盛況
IT培訓(xùn)IT培訓(xùn)
在線咨詢
IT培訓(xùn)IT培訓(xùn)
試聽
IT培訓(xùn)IT培訓(xùn)
入學(xué)教程
IT培訓(xùn)IT培訓(xùn)
立即報名
IT培訓(xùn)

Copyright 2011-2023 北京千鋒互聯(lián)科技有限公司 .All Right 京ICP備12003911號-5 京公網(wǎng)安備 11010802035720號