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