1

代码:

List<? extends Integer> ints= new ArrayList<Integer>();
ints.add(3);//error

我仍然不明白它是如何工作的。问题:

是什么意思CAP#1?它是引用类型吗?我认为,不,因为 CAP#1 不是从Object. 我们可以写ints.add(null);//OK,我们还没有编译时错误。但我们不能写null instanceof CAP#1;//compile-time error。为什么我们不能实例化CAP#1

CAP#1 c= new CAP#1();

从什么CAP#1出现?

4

2 回答 2

5

CAP#1是由 ' ' 表示的隐式类型变量的编译器名称?。没有这样的命名类型,但编译器需要为该类型创建一个占位符才能完成其工作。这个名字代表“捕获”。

它有助于在心理上重写一个喜欢的G<? extends T>类型∃CAP#1 extends T: G< CAP#1 >

您不能将任何内容添加到具有通配符扩展类型的列表中,因为您不知道该通配符代表什么。就像您不能将 a 添加Snake到 a一样List< Mammal >,您也不能将其添加到 aList< ? extends Animal >因为那?可能会代表Mammal

但是,您始终可以null在这种情况下添加,因为null它实际上是每个引用类型的成员,这必然包括?可能表示的任何内容。

我经常想知道为什么 Java 不将List< ? extends F >某些最终类型FList< F >. 也许是因为F它本身可能是一个通用的通配符类型,这意味着它仍然会有任意多个子类型。

除了 Angelika Langer 著名的关于 Java 泛型的常见问题解答之外,我一直在自己的列表中 编译一些关于它们的内容。

于 2013-10-11T06:52:58.903 回答
2

表示数字或未知的子类。如果您获得这样的值,它将是一个数字,但您不能给出这种类型的值,因为您不知道哪个是有效的。

有关更多信息,请遵循此答案: List<Number> 和 List<? 之间有什么区别?扩展号码>?

于 2013-10-11T06:47:46.233 回答