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