用于上限和下限通配符的Java泛型

cha*_*uru 8 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
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对于较低的有界通配符

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

我对此感到困惑,因为查看Sun Oracle文档,我理解代码也应该为第1点编译

上限通配符 下限通配符

有人可以帮我理解这个吗?

Fil*_*mek 9

这是因为当您使用上限时,无法将元素添加到集合中,只能读取它们.

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

List<? extends Number> l = new ArrayList<Integer>();
List<? extends Number> l = new ArrayList<Double>();
Run Code Online (Sandbox Code Playgroud)

所以你无法保证在添加对象时它会保存正确类型的对象.为了更好的解释,请遵循: 如何添加到列表<?扩展Number>数据结构?