为何无法向声明为List<?>的ArrayList<Integer>添加元素?
为什么
List<?>无法添加非null元素? 嘿,这个问题问到点子上了!很多刚接触Java泛型的开发者都会在这里卡壳,我来给你掰扯清楚核心逻辑:
首先得搞懂List<?>到底代表什么——它是一个元素类型完全未知的列表。编译器看到这个声明时,只知道这是个列表,但完全不确定里面能容纳什么类型的元素:可能是Integer,可能是String,甚至可能是Object。
那明明实际实例是ArrayList<Integer>,为啥还不让加Integer进去?关键在于Java泛型的类型检查是编译阶段的行为,编译器只认变量的声明类型List<?>,不管你实际new出来的是什么实例。如果允许你往List<?>里加Integer,那换个场景就会出大问题:
List<?> list = new ArrayList<String>(); // 这行代码完全合法 list.add(2); // 若允许执行,就把Integer塞进了String列表 String s = list.get(0); // 运行时直接抛出ClassCastException!
为了从源头避免这种运行时的类型安全事故,编译器干脆直接禁止:除了null(因为null可以被视为任何类型的实例),你不能往List<?>里添加任何元素。
那怎么解决你的问题?有两个常见方案:
- 如果从一开始就确定列表要存
Integer,直接把声明改成List<Integer> list = new ArrayList<>();,这样添加元素就完全合法了。 - 要是因为场景限制必须用通配符(比如方法参数需要兼容多种列表类型),可以改用
List<? super Integer>——这个通配符表示“可以容纳Integer或其父类的列表”,往里面添加Integer是完全合规的。
内容的提问来源于stack exchange,提问作者Yassine Badache
相关产品推荐
相关产品推荐

