2013-04-24 75 views
7

我在读java泛型,我遇到了一个有趣的查询。我的问题如下。上下界通配符的Java泛型

  1. 对于上界通配符

    public static void printList(List<? extends Number> list) { 
        for (int i = 0; i < 10; i++) { 
         list.add(i);// gives compilation error 
        } 
    } 
    
  2. 对于一个下界通配符

    public static void printList(List<? super Integer> list) { 
        for (int i = 0; i < 10; i++) { 
         list.add(i);// successfully compiles 
        } 
    } 
    

我很困惑这一点,因为看着太阳Oracle文档在我理解,代码也应编译为点1以及

Upper Bound Wildcard Lower Bound Wildcard

任何人都可以请帮我理解这一点吗?

+0

@baraky:感谢您的链接我错过了它......但仍然问题是为什么它不编译时,通用类型知道它必须是一个类扩展的数字。对于多余的问题抱歉。对我来说还不清楚。 – chaosguru 2013-04-24 10:17:40

回答

7

这是因为当你使用上限,你不能元素添加到收藏,只读它们。

这意味着,这些都是一些合法的分配:

List<? extends Number> l = new ArrayList<Integer>(); 
List<? extends Number> l = new ArrayList<Double>(); 

,所以你不能保证添加对象时,它会保持正确类型的对象。为更好的解释请遵循: How can I add to List<? extends Number> data structures?

1

实际上,幸运的是,同样的情况下,我在Sun Oracle文档的下几页中得到了答案。请找到下面的链接。对未来可能搜索的人有用。

Wildcard Capture