为什么不能创建类型参数的实例?

Abh*_*hri 4 java generics

在Java中,创建type参数实例是非法的,因此以下代码将不起作用:

class Gen<T> {
    T ob;
    Gen() {
        ob = new T(); // Illegal!!!
    }
}
Run Code Online (Sandbox Code Playgroud)

这背后的原因是:

T在运行时不存在,那么编译器将如何知道要创建的对象类型.

但我无法理解的是,使用erasure以下代码将转换为:

class Gen {
    Object ob;
    Gen() {
        ob = new Object(); // Perfectly Fine!!!
    }
}
Run Code Online (Sandbox Code Playgroud)

因为:

编译Java代码时,将删除(擦除)所有泛型类型信息.这意味着用它们的绑定类型替换类型参数,即Object如果没有指定显式绑定.

那么为什么实例化type参数是非法的呢?

Gho*_*ica 11

简单:因为那T可能是任何事情.

假设你有一个Gen<Integer>.惊喜:整数还不能有一个默认的构造函数.那么你打算如何做new Integer()呢?

编译器无法知道是否有一个默认构造函数T.

java.lang.Object 显然有这样的构造函数.

  • 它不仅仅是没有默认的构造函数:它是在编译时选择要调用的构造函数,这需要您知道在编译时将调用哪个类. (5认同)
  • 是的,我现在明白了.每个`Java类`都没有为它们定义的默认构造函数.谢谢你的澄清! (2认同)