我的代码是:
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
但是编译器不接受新的T()。有没有办法使用构造函数MyClass(),没有参数?
答案 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();
}
您必须添加抓取IllegalAccessException
和InstantiationException
。
答案 2 :(得分:1)
无法访问T的类对象。想想看,T可以是MyComponent的任何子类,你怎么能决定哪个构造函数在那个特定的子类上可用?
类型擦除意味着编译器以MyComponent静默替换对T的所有“实际”引用。
如果你有对Class的引用,你可以调用Class#newInstance
,或者获取一个构造函数并调用它。