代码:
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
出现?
发布于 2013-10-10 22:52:58
CAP#1
是由'?
‘表示的隐式类型变量的编译器名称。没有这样的命名类型,但编译器需要为该类型创建一个占位符,以便完成其工作。这个名字代表“捕获”。
它有助于在精神上重写一种类型,如G<? extends T>
到∃CAP#1 extends T: G< CAP#1 >
。
不能向具有通配符扩展类型的列表中添加任何内容,因为您不知道该通配符代表什么。就像不能将Snake
添加到List< Mammal >
中一样,也不能将其添加到List< ? extends Animal >
中,因为?
可能最终表示Mammal
。
但是,在这种情况下,始终可以添加null
,因为null
实际上是每种引用类型的成员,这必然包括?
可能表示的任何内容。
我经常想知道为什么Java不像对待List< ? extends F >
那样对待某些最终类型的F
和List< F >
。也许是因为F
本身可能是一个泛型通配符类型,这意味着它仍然有任意多个子类型。
除了Angelika关于Java泛型的著名常见问题外,我还在我自己的列表中编译了关于它们的有些事。
发布于 2013-10-10 22:47:46
表示一个子类的数目或未知值。如果您获得这样一个值,它将是一个数字,但是您不能给出这个类型的值,因为您不知道哪个值是有效的。
要获得更多信息,请遵循以下答案:and List?
https://stackoverflow.com/questions/19311808
复制