当我尝试使用上界通配符和下界通配符时,我发现了以下代码片段。
static void numsUpTo(Integer num, List<? super Integer> output) {
IntStream.rangeClosed(1, num)
.forEach(output::add);
}
ArrayList<Integer> integerList = new ArrayList<>();
ArrayList<Number> numberList = new ArrayList<>();
numsUpTo(5, integerList);
numsUpTo(5, numberList);
我不明白为什么
List<? super Integer>
接受
ArrayList<Number>
作为参数。
因为Number是Integer的超类,而不是Number的Integer,所以我希望看到错误。
List<? super Integer>
表示“将List
添加到Integer
”。
将Integer
添加到ArrayList<Number>
是完全合理的,因为ArrayList
的所有元素必须为Number
s,并且Integer
是Number
的子类。