在Java中,为什么可以';你不能在泛型类上使用构造函数吗?
在Java中执行以下操作的限制背后的逻辑是什么在Java中,为什么可以';你不能在泛型类上使用构造函数吗?,java,generics,Java,Generics,在Java中执行以下操作的限制背后的逻辑是什么 public class genericClass<T>{ void foo(){ T t = new T(); //Not allowed } } 公共类genericClass{ void foo(){ T=new T();//不允许 } } 因为类型擦除 运行时不知道T的“真实”类型,它是T的对象。您的代码大致如下所示: public class genericClass { void fo
public class genericClass<T>{
void foo(){
T t = new T(); //Not allowed
}
}
公共类genericClass{
void foo(){
T=new T();//不允许
}
}
因为类型擦除
运行时不知道T的“真实”类型,它是T的对象。您的代码大致如下所示:
public class genericClass {
void foo(){
Object t = new Object(); //Not allowed
}
}
如果您需要做这样的事情,您需要使用反射:
public class GenericClass<T> {
private final Class<? extends T> clazz;
public GenericClass(Class<? extends T> clazz) {
this.clazz = clazz;
}
void foo() {
T t = clazz.newInstance();
}
}
公共类GenericClass{
私有最终类在Java中,泛型是使用类型擦除实现的,这意味着泛型类型信息在编译时被擦除。这意味着用于构造对象的信息在运行时不可用。t
在运行时是未定义的,因为只有一个字节码副本。因此JVM无法区分哪个cla如果可以,如果T
没有无参数构造函数,或者它是私有的,或者T
是接口,会发生什么?(如果new genericClass().foo()
会怎么做?)因为T
不是真的——它只是编译器想象中的一个无花果。没有可调用的构造函数——T
的类型在运行时甚至不知道。可能是重复的,但你可以创建新对象()@AngeloNeuschitzer——但如果您创建了newobject()
您不能将其转换为任何其他对象。可能应该是t t=new Object()
当使用t时,您将拥有ClassCastException
。例如:如果您有t get()
方法和GenericClass a
:Foobar Foobar=a.get()
将失败,因为运行时类型将是对象
,而预期类型为Foobar
(在左侧)。