由於泛型的擦除(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]。
編譯器