代码:
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有一个没有参数的默认构造函数,所以没有问题。