java泛型方法返回类型

时间:2015-03-14 14:43:26

标签: java oop generics arraylist

在下面的代码中,方法“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"])
        }
    }

1 个答案:

答案 0 :(得分:2)

由于您尚未参数化此新实例创建表达式

new MyClass()

结果值是原始类型MyClassJava 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>

读: