java的泛型是個有趣的東西

由於泛型的擦除(erasure),任何在運行時須要知道確切類型信息的操做都將沒法工做。java

public class Erased<T> {
    private final int SIZE = 100;
    public static void f(Object arg){
        if (arg instanceof T){}        // error
        T var = new T();                  // error
        T[] array = new T[SIZE];    //  error
        T[] array = (T[])new Object[SIZE]; // unchecked warning
    }
}

請看上述代碼,"arg instanceof T",編譯器會認爲寫這段程序的人是想檢查arg是否爲某一個類。可是erasure致使這我的的願望落空,因此就把這段語句置爲error。數組


編譯器發現這段代碼時「T[] array = new T[SIZE]」,它不知道到底要建立一個什麼類型的數組,它沒有選擇把這段代碼編譯成建立Object數組,也許有它的理由,可是我不知道爲何。也許它認爲這不符合編寫這段程序的人的願望。code


編譯器發現這段代碼「T[] array = (T[])new Object[SIZE]",它認爲這能夠經過error檢查,可是這裏有個警告,會有隱藏的問題。而後它把這段代碼編譯成了Object[] array = new Object[SIZE]。
編譯器

相關文章
相關標籤/搜索