我的问题是关于泛型类和方法中使用的类型变量。
为什么我们不能做这样的事情T = new T();
或换句话说,为什么我们不能构造一个类型变量的对象?
我知道在编译过程中会删除通用信息,所有内容都会转换为
对象,为什么编译器不认为T
是一个对象而让我们构造它?
答案 0 :(得分:10)
问题在于,在运行时,JVM不知道T
实际代表哪个类(该信息不会在运行时保留,这就是“类型擦除”的含义)。因此,JVM只是看到你想要构造一个新的T
,但不知道实际调用哪个构造函数 - 因此它是不允许的。
有一些解决方法,但它不会像你提议的那样有用。
为什么编译器不会假设T. 是一个对象,让我们构建它 ??
嗯,当然运行时可以为你构建一个java.lang.Object
的实例,但这并不会真正有用,因为你真的想要一个T
。
答案 1 :(得分:2)
除了sleske的回答;如果需要在泛型类中创建T的对象,解决方案是将Class<T>
引用作为参数传递给构造函数或需要创建新对象的方法,并使用该类创建新实例。 / p>