实例化通用类型

时间:2013-09-26 21:37:42

标签: java generics instantiation

我的代码是:

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

但是编译器不接受新的T()。有没有办法使用构造函数MyClass(),没有参数?

3 个答案:

答案 0 :(得分:2)

你可以做到

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

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

}

答案 1 :(得分:1)

由于类型擦除,JVM不知道T是什么,因此无法实例化它。解决方法是提供Class<T>并使用它来创建新实例:

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

您必须添加抓取IllegalAccessExceptionInstantiationException

答案 2 :(得分:1)

无法访问T的类对象。想想看,T可以是MyComponent的任何子类,你怎么能决定哪个构造函数在那个特定的子类上可用?

类型擦除意味着编译器以MyComponent静默替换对T的所有“实际”引用。

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