我的问题涉及泛型类和方法中使用的类型变量。
为什么我们不能像这样做 T = new T();
或者换句话说,为什么我们不能构造一个类型变量的对象?
我知道在编译期间泛型信息会被擦除,并且一切都会转换为 Object,那么为什么编译器不假定 T
是一个对象并让我们构造它呢?
T
实际代表哪个类(这些信息在运行时不保留,这就是所谓的“类型擦除”)。因此,JVM只看到你想要构造一个新的T
,但不知道实际上要调用哪个构造函数 - 因此这是不允许的。为什么编译器不能假设T是一个对象并让我们构造它??
当然,运行时可以为您构造java.lang.Object
的实例,但这确实没有帮助,因为您真正想要的是一个T
。除了sleske的回答之外,如果你需要在泛型类中创建T的对象,则解决方案是传递一个Class<T>
引用作为构造函数或需要创建新对象的方法的参数,并使用该类来创建新实例。
((ParametrizedType)getClass()).getActualTypeArguments()[0].createNewInstance()
。当然,这假定存在默认构造函数。 - Joeri Hendrickx
T[]
以解决这个问题。 - Christian Mann