【问题标题】: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() 来做到这一点?
【问题讨论】:
标签:
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<T> 并使用它来创建一个新实例:
public MyClass(Class<T> clazz)
{
t = clazz.newInstance();
}
您必须添加捕获 IllegalAccessException 和 InstantiationException。
【解决方案3】:
不能不访问 T 的类对象。想一想,T 可以是 MyComponent 的任何子类,您如何决定该特定子类上可用的构造函数?
类型擦除意味着编译器会默默地将所有对 T 的“真实”引用替换为 MyComponent。
如果你有对 Class 的引用,你可以调用 Class#newInstance,或者获取一个构造函数并调用它。