实例化泛型类型

由于类型擦除,以下将不起作用:

public <T> void genericMethod() {
    T t = new T(); // Can not instantiate the type T.
}

T 类型被删除。因为在运行时,JVM 不知道 T 最初是什么,所以它不知道要调用哪个构造函数。

解决方法

  1. 调用 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

  1. 传递对 T 的构造函数的引用

    public <T> void genericMethod(Supplier<T> cons) {
        T t = cons.get();
    }
    
    genericMethod(String::new);