【问题标题】:Instantiate a Generic Type [duplicate]实例化泛型类型
【发布时间】:2013-10-03 01:35:24
【问题描述】:

我的代码是:

public class MyClass<T extends MyComponent> {
    private T t;
    public MyClass(){
        t = new T();
    }
}

但是编译器不接受 new T()。有没有办法使用没有参数的构造函数 MyClass() 来做到这一点?

【问题讨论】:

  • 在构造函数中指定T作为参数。
  • 如果你的 T 类没有空的构造函数会怎样?
  • 我的 T 类有一个空的构造函数
  • 无参数是做不到的。习惯就好。

标签: java generics instantiation


【解决方案1】:

你可以的

public class MyClass<T extends MyComponent> {
    private T t;

    MyClass(Class<T> clazz) throws InstantiationException,
            IllegalAccessException {
        t = clazz.newInstance();
    }

}

【讨论】:

    【解决方案2】:

    因为类型擦除,JVM不知道T是什么,所以无法实例化它。解决方法是提供一个Class&lt;T&gt; 并使用它来创建一个新实例:

    public MyClass(Class<T> clazz)
    {
        t = clazz.newInstance();
    }
    

    您必须添加捕获 IllegalAccessExceptionInstantiationException

    【讨论】:

      【解决方案3】:

      不能不访问 T 的类对象。想一想,T 可以是 MyComponent 的任何子类,您如何决定该特定子类上可用的构造函数?

      类型擦除意味着编译器会默默地将所有对 T 的“真实”引用替换为 MyComponent。

      如果你有对 Class 的引用,你可以调用 Class#newInstance,或者获取一个构造函数并调用它。

      【讨论】:

        猜你喜欢
        • 2011-04-02
        • 1970-01-01
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        • 2018-12-19
        • 1970-01-01
        相关资源
        最近更新 更多