用于上限的Java泛型&下界外卡

时间:2013-04-24 10:09:29

标签: java generics collections wildcard

我正在阅读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
        }
    }
    
  3. 我对此感到困惑,因为查看Sun Oracle文档,我理解代码应该为第1点编译

    Upper Bound Wildcard Lower Bound Wildcard

    有谁可以帮我理解这个?

2 个答案:

答案 0 :(得分:8)

这是因为当你使用上限时,你不能将元素添加到集合中,只能读取它们。

这意味着这些是一些合法的任务:

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 :(得分:1)

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

Wildcard Capture