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
相关产品推荐
相关产品推荐

