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
}
}
偶尔你在编程的时候绕过这些事情,但是有的时候必须通过插入类型标签来作类型擦除的补偿。这就是说你必须准确的插入类型对象用它作为类型信息的表达。
其实以上出错就是由于类型信息的缺失。
类型的补偿,补偿的方式通过模板方法来实现:
abstract class GenericWithCreate<T>{
final T element;
GenericWithCreate(){element = create();}
abstract T create();
}
class X {}
class Creator extends GenericWithCreate<X>{
X create(){ return new X();}
void f(){
System.out.println(element.getClass().getSimpleName(););
}
}
public class CreatorGeneric{
public static void main(String[] args){
Creator c = new Creator();
c.f();
}
}
//output
X