我的代码是:
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
但是编译器不接受 new T()。有没有办法使用没有参数的构造函数 MyClass() 来做到这一点?
我的代码是:
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
但是编译器不接受 new T()。有没有办法使用没有参数的构造函数 MyClass() 来做到这一点?
你可以做
public class MyClass<T extends MyComponent> {
private T t;
MyClass(Class<T> clazz) throws InstantiationException,
IllegalAccessException {
t = clazz.newInstance();
}
}
因为类型擦除,JVM 不知道是什么T
,所以它不能实例化它。解决方法是提供一个Class<T>
并使用它来创建一个新实例:
public MyClass(Class<T> clazz)
{
t = clazz.newInstance();
}
您必须添加捕获IllegalAccessException
和InstantiationException
.
并非没有访问 T 的类对象。想一想,T 可以是 MyComponent 的任何子类,您甚至如何决定该特定子类上可用的构造函数?
类型擦除意味着编译器默默地用 MyComponent 替换所有对 T 的“真实”引用。
如果你有对 Class 的引用,你可以调用Class#newInstance
,或者获取一个构造函数并调用它。