泛型原始類型
原始類型是沒(méi)有任何類型參數(shù)的泛型類或接口的名稱,例如,給定Box泛型類:
public class Box{ public void set(T t) { /* ... */ } // ... }
要?jiǎng)?chuàng)建參數(shù)化類型的Box
BoxintBox = new Box<>();
如果省略實(shí)際的類型參數(shù),則創(chuàng)建一個(gè)原始類型Box
Box rawBox = new Box();
因此,Box是泛型Box
原始類型出現(xiàn)在遺留代碼中,因?yàn)樵S多API類(例如Collections類)在JDK 5.0之前不是泛型的,使用原始類型時(shí),你實(shí)際上獲得預(yù)泛型行為 — Box會(huì)為你提供Object,為了向后兼容,允許將參數(shù)化類型分配給其原始類型:
BoxstringBox = new Box<>(); Box rawBox = stringBox; // OK
但是,如果將原始類型分配給參數(shù)化類型,則會(huì)收到警告:
Box rawBox = new Box(); // rawBox is a raw type of BoxBox intBox = rawBox; // warning: unchecked conversion
如果使用原始類型調(diào)用相應(yīng)泛型類型中定義的泛型方法,也會(huì)收到警告:
BoxstringBox = new Box<>(); Box rawBox = stringBox; rawBox.set(8); // warning: unchecked invocation to set(T)
警告顯示原始類型繞過(guò)泛型類型檢查,將不安全代碼的捕獲延遲到運(yùn)行時(shí),因此,你應(yīng)該避免使用原始類型。
類型消除部分提供了有關(guān)Java編譯器如何使用原始類型的更多信息。
未經(jīng)檢查的錯(cuò)誤消息如前所述,在將遺留代碼與泛型代碼混合時(shí),你可能會(huì)遇到類似于以下內(nèi)容的警告消息:
Note: Example.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
在使用對(duì)原始類型進(jìn)行操作的舊API時(shí)會(huì)發(fā)生這種情況,如以下示例所示:
public class WarningDemo { public static void main(String[] args){ Boxbi; bi = createBox(); } static Box createBox(){ return new Box(); } }
術(shù)語(yǔ)“unchecked”表示編譯器沒(méi)有足夠的類型信息來(lái)執(zhí)行確保類型安全所必需的所有類型檢查,默認(rèn)情況下,“unchecked”警告被禁用,盡管編譯器會(huì)提示,要查看所有“unchecked”警告,請(qǐng)使用-Xlint:unchecked重新編譯。
使用-Xlint:unchecked重新編譯上一個(gè)示例顯示以下附加信息:
WarningDemo.java:4: warning: [unchecked] unchecked conversion found : Box required: Boxbi = createBox(); ^ 1 warning
要完全禁用使用-Xlint:-unchecked標(biāo)志的未經(jīng)檢查的警告,@SuppressWarnings("unchecked")注解會(huì)抑制未經(jīng)檢查的警告,如果你不熟悉@SuppressWarnings語(yǔ)法,請(qǐng)參閱注解。
上一篇:泛型類型 下一篇:泛型方法文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72925.html
泛型類型 泛型類型是通過(guò)類型參數(shù)化的泛型類或接口,修改以下Box類以演示此概念。 一個(gè)簡(jiǎn)單的Box類 首先檢查一個(gè)對(duì)任何類型的對(duì)象進(jìn)行操作的非泛型Box類,它只需要提供兩個(gè)方法:set,它將一個(gè)對(duì)象添加到box中,get,它將檢索它: public class Box { private Object object; public void set(Object object) ...
自動(dòng)裝箱和拆箱 自動(dòng)裝箱是Java編譯器在基元類型和相應(yīng)的對(duì)象包裝類之間進(jìn)行的自動(dòng)轉(zhuǎn)換,例如,將int轉(zhuǎn)換為Integer,將double轉(zhuǎn)換為Double,依此類推,如果轉(zhuǎn)換是另一種方式,則稱為拆箱。 以下是自動(dòng)裝箱的最簡(jiǎn)單示例: Character ch = a; 本節(jié)中的其余示例使用泛型,如果您還不熟悉泛型的語(yǔ)法,請(qǐng)參閱泛型課程。 考慮以下代碼: List li = new ArrayLis...
泛型的限制 要有效地使用Java泛型,必須考慮以下限制: 無(wú)法使用基元類型實(shí)例化泛型類型 無(wú)法創(chuàng)建類型參數(shù)的實(shí)例 無(wú)法聲明類型為類型參數(shù)的靜態(tài)字段 無(wú)法對(duì)參數(shù)化類型使用強(qiáng)制類型轉(zhuǎn)換或instanceof 無(wú)法創(chuàng)建參數(shù)化類型的數(shù)組 無(wú)法創(chuàng)建、捕獲或拋出參數(shù)化類型的對(duì)象 無(wú)法重載將每個(gè)重載的形式參數(shù)類型擦除為相同原始類型的方法 無(wú)法使用基元類型實(shí)例化泛型類型 考慮以下參數(shù)化類型: class P...
類型擦除 泛型被引入到Java語(yǔ)言中,以便在編譯時(shí)提供更嚴(yán)格的類型檢查并支持通用編程,為了實(shí)現(xiàn)泛型,Java編譯器將類型擦除應(yīng)用于: 如果類型參數(shù)是無(wú)界的,則用它們的邊界或Object替換泛型類型中的所有類型參數(shù),因此,生成的字節(jié)碼僅包含普通的類、接口和方法。 如有必要,插入類型轉(zhuǎn)換以保持類型安全。 生成橋接方法以保留擴(kuò)展泛型類型中的多態(tài)性。 類型擦除確保不為參數(shù)化類型創(chuàng)建新類,因此,泛型不會(huì)...
Java? 教程 Java教程是為JDK 8編寫(xiě)的,本頁(yè)面中描述的示例和實(shí)踐沒(méi)有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語(yǔ)言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個(gè)完整的工作示例和數(shù)十個(gè)課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識(shí)的路徑 這些教程以書(shū)籍的形式提供,如Java教程,第六版,前往Amazon.com購(gòu)買。 入門 介紹Java技術(shù)和安裝Java開(kāi)發(fā)軟件并使用...
閱讀 1454·2021-09-22 10:02
閱讀 2238·2021-09-08 09:35
閱讀 4190·2021-08-12 13:29
閱讀 2683·2019-08-30 15:55
閱讀 2320·2019-08-30 15:53
閱讀 2381·2019-08-29 17:13
閱讀 2827·2019-08-29 16:31
閱讀 3012·2019-08-29 12:24