与超级的通配符

时间:2013-09-23 16:08:17

标签: java wildcard

考虑

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>的类型?为什么呢?

1 个答案:

答案 0 :(得分:2)

当然 - 你知道无论通配符的值是什么,它都是Integer的超类(根据定义,来自边界)。所以无论具体类是什么,你都有一个可以容纳Integer的东西的列表。 List<Object>List<Number>与此上下文中的List<Integer>一样有效。

然而,使用 extends ,这是一个不同的故事。 List<? extends Number>可以是List<Double>,因此很明显,在不违反类型安全的情况下,无法将整数插入此列表。 (事实上​​,除了null之外,根本没有任何东西可以插入 - 出于这个原因。)