巨乳在线中文字幕,巨乳诱惑中文字幕,中文字幕人成乱码熟女_腾讯视频
  • 當前位置: 首頁 / 技術分享 / 正文
    集合泛型不匹配導致的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號

    巨乳在线中文字幕,巨乳诱惑中文字幕,中文字幕人成乱码熟女_腾讯视频