-1

我的代码是:

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

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

4

3 回答 3

3

你可以做

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

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

}
于 2013-09-26T21:40:53.243 回答
1

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

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

您必须添加捕获IllegalAccessExceptionInstantiationException.

于 2013-09-26T21:40:46.770 回答
1

并非没有访问 T 的类对象。想一想,T 可以是 MyComponent 的任何子类,您甚至如何决定该特定子类上可用的构造函数?

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

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

于 2013-09-26T21:42:27.667 回答