在下面的代码中,方法“bla()”返回Object的ArrayList而不是String,为什么会这样?
public class MyClass<T>{
public ArrayList<String> bla(){
return new ArrayList<String>();
}
public static void foo(){
new MyClass().bla().add([here auto complete says "Object" not "String"])
}
}
答案 0 :(得分:2)
由于您尚未参数化此新实例创建表达式
new MyClass()
结果值是原始类型MyClass
。 Java Language Specification states
构造函数的类型(第8.8节),实例方法(第8.4节,第9.4节),或者 原始类型
C
的非静态字段(第8.3节),它不是从其继承的 超类或超接口是对应的原始类型 在与C
对应的通用声明中删除其类型。
那是
public ArrayList<String> bla(){
return new ArrayList<String>();
}
现在被视为
public ArrayList bla() {
return new ArrayList<String>();
}
返回类型本身就是原始类型ArrayList
,其add
方法的类型也成为其擦除的原始类型,即。来自通用变量Object
的{{1}}。
显然,您仍然可以向期望T
的方法添加String
,但对于具有Object
实例的正确参数化视图的任何人,类型安全性都会被破坏。 / p>
读: