Java实例化泛型类型
示例
由于类型擦除,以下内容将不起作用:
public <T> void genericMethod() { T t = new T(); //无法实例化类型T。 }
类型T被删除。由于JVM在运行时不知道T原来是什么,因此它不知道要调用哪个构造函数。
解决方法
T调用时传递的类genericMethod:
public<T>voidgenericMethod(Class<T>cls){
try{
Tt=cls.newInstance();
}catch(InstantiationException|IllegalAccessExceptione){
System.err.println("无法实例化:"+cls.getName());
}
}
genericMethod(String.class);
这将引发异常,因为无法知道所传递的类是否具有可访问的默认构造函数。
传递对T的构造函数的引用:
public<T>voidgenericMethod(Supplier<T>cons){
Tt=cons.get();
}
genericMethod(String::new);