用于上限的Java泛型&

Java Generics for Upper bound & lower bound wild cards

我正在阅读Java泛型,我遇到了一个有趣的查询。我的问题如下。

  • 对于上界通配符

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

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

  • 我对此感到困惑,因为在查看Sun Oracle文档时,我了解到代码也应该针对点1进行编译。

    上界通配符下界通配符

    有人能帮我理解吗?


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

    这意味着这些是一些法律任务:

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

    因此,您不能保证在添加对象时,它将保存正确的对象类型。为了更好的解释,请遵循:如何添加到列表<?扩展数字>数据结构?


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

    通配符捕获