Java实例化泛型类型

示例

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

public <T> void genericMethod() {
    T t = new T(); // 无法实例化类型T。
}

类型T被删除。由于JVM在运行时不知道T原来是什么,因此它不知道要调用哪个构造函数。


解决方法

  1. 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);

    这将引发异常,因为无法知道所传递的类是否具有可访问的默认构造函数。

Java SE 8
  1. 传递对T的构造函数的引用:

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