List <! - ?之间的区别扩展了A - >和列出<a>

时间:2016-02-01 11:42:14

标签: java generics collections

I've been for ages trying to figure out what's on earth the difference between a List<? extends A> and a List<A>.

What can I do, what couldn't I do...?

2 个答案:

答案 0 :(得分:2)

List<? extends A>引用将允许其值为List A或任何子/实现类。

例如,对于父类A和子B,以下习语有效:

List<? extends A> list = new ArrayList<B>();

...而List<A> list = new ArrayList<B>();无法编译。

<强>然而

带有通配符(<? extends A>成语)的有界类型参数需要付出代价。

add不能List元素,只能删除元素,迭代元素或查询其内容。

这是因为列表中特定类型的元素在运行时将是未知的,因此添加任何元素都是不安全的。

答案 1 :(得分:1)

如果你有class B extends A那么

你可以这样做:

List<? extends A> myList = new ArrayList<B>();

因为List<? extends A>是一个列表,其泛型类型是A的某个子类型。 因此,您无法安全地将任何内容放入List<? extends A>,因为您不知道它的泛型类型实际上有多具体。您只知道其中包含的项目必须为A,因此您可以将A取出来。

你做不到:

List<A> myList = new ArrayList<B>();

因为List<A>是一个通用类型为A的列表。

因此,如果您有List<A>,则您知道其通用类型正好是A,因此您可以将A的任何实例放入其中。