如果A extends X,
下面的声明是有效的
List<? extends X> list = new ArrayList<A>();
列表似乎包含扩展 X 的元素集合。因此,new A()
应该符合条件。
是的,它没有。这是为什么?
最佳答案
你已经快搞定了。 List<? extends X>
意思是“某种类型(我实际上不知道)的列表,它是 X 的子类型(或者可能是 X 本身)”。
问题是如果 X 是,例如 Number
.那么List<? extends X>
表示 List<Double>
或 List<Integer>
或者你刚才说的一些其他类型,你实际上并不知道。您不能插入任何 Number
进入 List<Integer>
.因此,由于您不知道列表元素的类型,因此无法将任何内容 插入List<? extends Number>
中。 .但是,您可以检索 列表中的值,并且可以保证列表中包含的任何值至少是Number
。 .
有关更多信息,请阅读 Effective Java, 2nd Ed. 中的第 28 项:使用有界通配符提高 API 灵 active 作者 Joshua Bloch(一本每个 Java 程序员都应该放在书架上的书)。特别说明一下助记符PECS,意思是“producer extends, consumer super”,可以帮助你记住extends
是什么和 super
关键字在 Java 泛型中的含义以及何时应使用它们。
关于java - 将元素添加到 List<?扩展父类(super class)>,需要澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11781429/