考虑
class MyClass{
List<? extends Number> nums= new ArrayList<Integer>();
nums.add(3.14);//Compile error
}
在错误的描述中,我们有:excepted add(int, Object), found add(int,CAP#1)
。对CAP#1
的辩护是什么?为什么会出现这个错误?
答案 0 :(得分:2)
这是因为nums是List<? extends Number>
,因此编译器知道它是Number of Number或Number的某个子类,但它不知道哪个。因此,永远不会允许您向此类列表添加任何内容。以下是这意味着的一个例子:
List<? extends Number> nums= new ArrayList<Integer>();
和
List<? extends Number> nums= new ArrayList<Double>();
都是有效的作业。但是,如果你这样做:
nums.add(new Integer(4));
编译器不接受此,因为无法确定nums是Integer
的列表。