代码:
class MyClass<T>{
public void method(){
new ArrayList<T>();//OK- Why?
}
}
为什么在这种情况下我们没有编译错误。类型T
在编译时与特定类型不匹配。
代码:
class MyClass<T>{
public void method(){
new ArrayList<T>();//OK- Why?
}
}
为什么在这种情况下我们没有编译错误。类型T
在编译时与特定类型不匹配。
当您创建 的实例时MyClass
,您必须提供类型T
。因此,当 call 时method
, typeT
将绑定到T
构造中定义的任何类型MyClass
。
从技术上讲,Java 编译器不需要知道 T 的确切类型来生成代码。它在称为擦除的过程中将所有泛型类型转换为 Object。
当然,在编译时它会检查程序是否“类型正确”。在这种情况下是这样,因为 T 只是在构造类时赋予类的参数。因此,当您调用new ArrayList<T>
类型时ArrayList<T>
,因为类型 T 被定义,所以它被认为是已知的。
您正在实例化一个ArrayList
,而不是一个T
. Javac在编译时可以知道ArrayList
有一个没有参数的默认构造函数,所以没有问题。