当我尝试使用上界和下界通配符时,我发现了以下代码片段。
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
添加到的List
(或Integer
子类的实例)”。ArrayList
是List
的子类;并且将Integer
添加到ArrayList<Number>
是完全合理的,因为ArrayList
的所有元素都必须为Number
,并且Integer
是Number
的子类。