Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,为什么可以';你不能在泛型类上使用构造函数吗?_Java_Generics - Fatal编程技术网

在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

在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 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
(在左侧)。