第23條:請(qǐng)不要在新代碼中使用原生態(tài)類型

術(shù)語(yǔ)介紹:聲明中具有一個(gè)或者多個(gè)類型參數(shù)的類或者接口,就是泛型類或者接口。
例如:List接口就有單個(gè)參數(shù)類型E,表示列表的元素類型。
每個(gè)泛型都定義了一個(gè)原生態(tài)類型。
例如:List<E>相對(duì)應(yīng)的原生態(tài)類型是List。
如果有設(shè)置泛型,則插入錯(cuò)誤的類型,在編譯的時(shí)候就會(huì)出錯(cuò)。如果沒有,則只有當(dāng)在運(yùn)行的時(shí)候(取出強(qiáng)轉(zhuǎn))出錯(cuò)。
如果要使用泛型,但不確定或者不關(guān)心實(shí)際的類型參數(shù),就可以使用一個(gè)問號(hào)代替。
例如:泛型Set<E>的無(wú)限制通配符類型為Set<?>(讀作“某個(gè)類型的集合”)

問:原生態(tài)List和參數(shù)化的類型List<Object>之間到底有什么區(qū)別呢?

答:不嚴(yán)格的說(shuō)前者逃避了泛型檢查,后者則明確告知編譯器,它能夠持有任意類型的對(duì)象。雖然你可以將List<String>傳遞給類型List的參數(shù),但是不能將它傳給類型List<Object>的參數(shù)。泛型有子類型化的規(guī)則,List<String>是原生態(tài)類型的一個(gè)子類型,而不是參數(shù)化類型List<Object>的子類型。
這個(gè)規(guī)則有兩個(gè)小小的例外。

  1. 在類文字中必須使用原生態(tài)類型。規(guī)范不允許使用參數(shù)化類型(但是允許數(shù)組類型和基本類型)
    例如:List.class,String[].class和int.class。
  2. 由于泛型信息可以在運(yùn)行時(shí)被擦除,因此在此參數(shù)化類型而非無(wú)限制通配符類型上使用instanceof操作符是非法的。用無(wú)限制通配符類型代替原生態(tài)類型,對(duì)instanceof操作符的行為不會(huì)產(chǎn)生任何影響。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 聲明中具有一個(gè)或者多個(gè)類型參數(shù)的類或者接口,就是泛型類或者接口。沒有使用泛型的類型就是原生態(tài)類型。 每種泛型定義一...
    慧執(zhí)行閱讀 670評(píng)論 0 0
  • 泛型:聲明中具有一個(gè)或多個(gè)類型參數(shù)的類或者接口就是泛型 原生態(tài)類型的泛型:不帶任何實(shí)際參數(shù)的泛型名稱,例如List...
    趙鎮(zhèn)閱讀 447評(píng)論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,539評(píng)論 19 139
  • 對(duì)象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對(duì)象:僅僅是創(chuàng)建對(duì)象的方法,并非Fa...
    孫小磊閱讀 2,182評(píng)論 0 3
  • 吾心常懷春秋理, 紅塵偏染敝襕衫。 半生淡看風(fēng)云起, 一嘯紅塵煙雨散。
    倩_8edf閱讀 171評(píng)論 0 0

友情鏈接更多精彩內(nèi)容