考虑
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>
的类型?为什么呢?
答案 0 :(得分:2)
当然 - 你知道无论通配符的值是什么,它都是Integer
的超类(根据定义,来自边界)。所以无论具体类是什么,你都有一个可以容纳Integer
的东西的列表。 List<Object>
或List<Number>
与此上下文中的List<Integer>
一样有效。
然而,使用 extends ,这是一个不同的故事。 List<? extends Number>
可以是List<Double>
,因此很明显,在不违反类型安全的情况下,无法将整数插入此列表。 (事实上,除了null
之外,根本没有任何东西可以插入 - 出于这个原因。)