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