实例化泛型类型
由于类型擦除,以下将不起作用:
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);