You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java泛型下界疑问:为何Arrays.asList可加String而List.add不行?

为什么List<? super Number>能接收含String的Arrays.asList但直接add String会报错?

先看第一种编译报错的场景:

List<? super Number> numList = new ArrayList<>();
numList.add(1);
numList.add(3.0);
numList.add("hello"); // 此处编译报错

编译器识别List<? super Number>时,只明确这个列表的元素类型是Number的某个父类型(包括Number本身),但无法确定具体是哪一种——可能是List<Object>,也可能是List<Number>。如果实际是List<Number>,添加String显然不合法,所以编译器直接拦截这个操作,避免潜在的类型安全问题。

再看第二种能正常运行的场景:

List<? super Number> numList = Arrays.asList(1, 2, 3.0, "hello"); 

Arrays.asList的返回类型是由所有传入参数的共同父类型推导而来的。这里Integer、Double、String的共同父类型是Object,所以这个方法实际返回的是List<Object>。而List<Object>完全符合List<? super Number>的通配符要求(Object是Number的父类),因此可以顺利赋值。此时列表的实际类型是List<Object>,存放String本身就是合法操作,自然不会报错。

内容的提问来源于stack exchange,提问作者Khanna111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 23:02:04