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)。有人可以解释一下吗?
答案 0 :(得分:1)
在Java中,泛型是不变的。这意味着即使SubType
是SuperType<String>
,也不意味着List<SubType>
是List<SuperType<?>>
甚至是List<SuperType<String>>
。这就是为什么(1)是一个错误。您可以通过引入通配符来解决此问题:
List<? extends SuperType<?>> ls = new ArrayList<SubType>();
第二行不是错误,因为通配符?
表示任何类型。
请注意,使用通配符会限制此类列表可以执行的操作,例如在您调用add
时。