0

考虑

List<? super Integer> lst= new ArrayList<Number>();
lst.add(new Integer(3)); //ok- why?? I expected compile error "expected add(int, Object), found add(int,CAP#1)"
lst.get(0); //ok

List <? extends Number> nums= new ArrayList<Integer>();
lst.add(new Integer(3));//Compile error- expected add(int, Object), found add(int,CAP#1)

在编译状态下,我们不知道类型<? extends Number>并且有编译错误。我们知道<? super Integer>编译状态的类型吗?为什么?

4

1 回答 1

2

当然 - 你知道,无论通配符的值是什么,它都是Integer(根据定义,从边界)的超类。所以无论它的具体类是什么,你都有一个可以容纳Integer. 在这种情况下,AList<Object>List<Number>与 a 一样有效。List<Integer>

然而,使用extends,情况就不同了。AList<? extends Number>可能是 a List<Double>,因此很明显,在不违反类型安全的情况下不能将 Integer 插入此列表。(事实上​​,null出于这个原因,除此之外,根本无法插入任何内容。)

于 2013-09-23T16:10:00.863 回答