考虑
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
?为什么会导致这个错误?
这是因为 nums 是 a List<? extends Number>
,所以编译器知道它是 Number 的 List 或 Number 的某个子类,但不知道是哪个。因此,您永远不会被允许在这样的列表中添加任何内容。以下是这意味着什么的示例:
List<? extends Number> nums= new ArrayList<Integer>();
和
List<? extends Number> nums= new ArrayList<Double>();
都是有效的分配。但是,如果您这样做:
nums.add(new Integer(4));
编译器不会接受这一点,因为它不能确定 nums 是Integer
.