在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 显然有这样的构造函数.
| 归档时间: |
|
| 查看次数: |
79 次 |
| 最近记录: |