原始類型是沒有任何類型參數的泛型類或接口的名稱,例如,給定Box
泛型類:java
public class Box<T> { public void set(T t) { /* ... */ } // ... }
要建立參數化類型的Box<T>
,請爲形式類型參數T
提供實際類型參數:segmentfault
Box<Integer> intBox = new Box<>();
若是省略實際的類型參數,則建立一個原始類型Box<T>
:安全
Box rawBox = new Box();
所以,Box
是泛型Box<T>
的原始類型,可是,非泛型類或接口類型不是原始類型。ui
原始類型出如今遺留代碼中,由於許多API類(例如Collections
類)在JDK 5.0以前不是泛型的,使用原始類型時,你實際上得到預泛型行爲 — Box
會爲你提供Object
,爲了向後兼容,容許將參數化類型分配給其原始類型:code
Box<String> stringBox = new Box<>(); Box rawBox = stringBox; // OK
可是,若是將原始類型分配給參數化類型,則會收到警告:接口
Box rawBox = new Box(); // rawBox is a raw type of Box<T> Box<Integer> intBox = rawBox; // warning: unchecked conversion
若是使用原始類型調用相應泛型類型中定義的泛型方法,也會收到警告:get
Box<String> stringBox = new Box<>(); Box rawBox = stringBox; rawBox.set(8); // warning: unchecked invocation to set(T)
警告顯示原始類型繞過泛型類型檢查,將不安全代碼的捕獲延遲到運行時,所以,你應該避免使用原始類型。編譯器
類型消除部分提供了有關Java編譯器如何使用原始類型的更多信息。string
如前所述,在將遺留代碼與泛型代碼混合時,你可能會遇到相似於如下內容的警告消息:it
Note: Example.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
在使用對原始類型進行操做的舊API時會發生這種狀況,如如下示例所示:
public class WarningDemo { public static void main(String[] args){ Box<Integer> bi; bi = createBox(); } static Box createBox(){ return new Box(); } }
術語「unchecked」表示編譯器沒有足夠的類型信息來執行確保類型安全所必需的全部類型檢查,默認狀況下,「unchecked」警告被禁用,儘管編譯器會提示,要查看全部「unchecked」警告,請使用-Xlint:unchecked
從新編譯。
使用-Xlint:unchecked
從新編譯上一個示例顯示如下附加信息:
WarningDemo.java:4: warning: [unchecked] unchecked conversion found : Box required: Box<java.lang.Integer> bi = createBox(); ^ 1 warning
要徹底禁用使用-Xlint:-unchecked
標誌的未經檢查的警告,@SuppressWarnings("unchecked")
註解會抑制未經檢查的警告,若是你不熟悉@SuppressWarnings
語法,請參閱註解。