當前位置: 首頁 / 技術分享 / 正文
集合泛型不匹配導致的ClassCastException異常解決過程

2023-01-06

泛型 類型   

  一. 代碼重現

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

圖片 1

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

圖片 2

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

  二. bug分析

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

圖片 3

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

  三. 泛型的擦除

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

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

  四. 泛型相關知識回顧

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

  1. 泛型的應用

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

  2. 泛型通配符

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

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

  泛型上限:

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

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

  泛型下限:

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

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

  具體用法,如下圖所示:

圖片 4

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

分享: 更多

上一篇:YARN的Job提交流程

下一篇:校園疫情信息化系統

好程序員公眾號

  • · 剖析行業發展趨勢
  • · 匯聚企業項目源碼

好程序員開班動態

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

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

    開班盛況

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

    開班盛況
  • 大數據+人工智能 <高端班>

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

    開班盛況

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

    開班盛況
  • JavaEE分布式開發 <高端班>

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

    開班盛況

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

    開班盛況
  • Python人工智能+數據分析 <高端班>

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

    預約報名

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

    開班盛況
  • 云計算開發 <高端班>

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

    預約報名

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

    開班盛況
在線咨詢
試聽
入學教程
立即報名

Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號

美女裸体黄网站18禁免费_美女裸体黄网站啪啪18禁_美女裸体黄污18禁网站免费下载