由于泛型的擦除(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]。
编译器