你应该使用
吗?List<ParentClass> foo = new ArrayList<ParentClass>
foo.add(ChildClassObject)
或
List<? extends ParentClass> bar - new ArrayList<ParentClass>
bar.add(ChildClassObject)
另外,有人可以向我解释一下List的后一个参数化吗?
答案 0 :(得分:4)
使用第一种方法。第二个不允许您添加任何元素。这是因为第二种方法使用扩展ParentClass
的未知类型,并且无法确保要存储的元素来自此类型。
更多信息:
答案 1 :(得分:3)
List<? extends ParentClass>
是某些特定子类型ParentClass
的列表。因为,它不知道它究竟是什么具体的子类型,编译器不会让你添加任何对象。
对于初学者来说,很容易误认为 ParentClass
的任何子类型,并想知道为什么他们无法添加子类型的实例。
例如,假设您有以下类层次结构 -
class P { }
class A extends P { }
class B extends P { }
现在,如果您声明一个列表如下 -
List<? extends P> l = ...;
这意味着l
是P
的某个特定子类型的列表,可以是A
或B
(甚至P
本身),但编译器并不确切知道哪一个。因此,您无法向其中添加任何内容,因为您可能会将B
的实例添加到A
列表中,从而造成一些堆污染。
当您只想将列表元素作为P
的实例阅读时,您会声明这样的列表。