如果你想要列出单个父类的各种子类列表,你会怎么做?

时间:2014-06-13 14:16:03

标签: java

你应该使用

吗?
List<ParentClass> foo = new ArrayList<ParentClass>
foo.add(ChildClassObject)

List<? extends ParentClass> bar - new ArrayList<ParentClass>
bar.add(ChildClassObject)

另外,有人可以向我解释一下List的后一个参数化吗?

2 个答案:

答案 0 :(得分:4)

使用第一种方法。第二个不允许您添加任何元素。这是因为第二种方法使用扩展ParentClass的未知类型,并且无法确保要存储的元素来自此类型。

更多信息:

答案 1 :(得分:3)

List<? extends ParentClass>某些特定子类型ParentClass 的列表。因为,它不知道它究竟是什么具体的子类型,编译器不会让你添加任何对象。

对于初学者来说,很容易误认为 ParentClass 的任何子类型,并想知道为什么他们无法添加子类型的实例。

例如,假设您有以下类层次结构 -

class P { }
class A extends P { }
class B extends P { }

现在,如果您声明一个列表如下 -

List<? extends P> l = ...;

这意味着lP的某个特定子类型的列表,可以是AB(甚至P本身),但编译器并不确切知道哪一个。因此,您无法向其中添加任何内容,因为您可能会将B的实例添加到A列表中,从而造成一些堆污染。

当您只想将列表元素作为P的实例阅读时,您会声明这样的列表。