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...?
答案 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
的任何实例放入其中。