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