Java泛型中键入Mismatch错误

时间:2014-08-13 18:22:51

标签: java generics

public class SuperType<T> {

    T var;

    public T getVar(){
        return var;
    }
}

public class SubType extends SuperType<String>{

    public static void main(String args[]){
        List<SuperType<?>> ls = new ArrayList<SubType>();//(1) throwing an error
        List<?> ls1 = new ArrayList<String>();// no error
     }
}

我试图弄清楚为什么会抛出错误(1)。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

在Java中,泛型是不变的。这意味着即使SubTypeSuperType<String>,也不意味着List<SubType>List<SuperType<?>>甚至是List<SuperType<String>>。这就是为什么(1)是一个错误。您可以通过引入通配符来解决此问题:

List<? extends SuperType<?>> ls = new ArrayList<SubType>();

第二行不是错误,因为通配符?表示任何类型。

请注意,使用通配符会限制此类列表可以执行的操作,例如在您调用add时。