Java列表如何设置和获取父类型列表的子对象

时间:2015-02-28 17:35:26

标签: java inheritance linked-list parent-child

如果我有一个父对象的链接列表,如:

LinkedList<ParentClass> list = new LinkedList<ParentClass>();

我想用不同类型的子对象(所有扩展为“ParentClass”)填充它们,我将如何进行此操作。 另请注意,我不知道将使用哪个特定的子类。例如,我可以尝试:

list.add(someInstanceOfAChildClass);

然后能够访问该子类中的方法和属性。 如果我没有明白我的意思,我可以澄清一下。 提前谢谢!

3 个答案:

答案 0 :(得分:5)

使用不同的List<Parent>对象填充Child您没有任何问题,但您无法直接访问Child的方法和属性。如果您尝试将List成员分配给Child类型的引用,则会出现类型不匹配错误。

要解决此问题,您可以显式输入 List明确返回的对象。

Child iThinkItsChild = (Child) listOfParents.get(indexOfChild);

但是,要安全地执行此操作,您应首先使用instanceof运算符。

Parent parent = listOfParents.get(indexOfChild);
if (parent instanceof Child) {
    Child imSureItsChildNow = (Child) parent;
    imSureItsChildNow.childMethod();
}

答案 1 :(得分:1)

您只需添加子类元素。当它们扩展ParentClass时,它们可以添加到任何包含ParentClass类型的集合中。

答案 2 :(得分:0)

你在谈论多态性。如果你有:

public class A extends ParentClass {...}
public class B extends ParentClass {...}

您只需要将AB的实例添加到列表中,例如

list.add(new A()); // add a A
list.add(new A()); // add another A
list.add(new B()); // add a B

然后,如果你想在列表的所有元素上做一些事情,例如

for (ParentClass foo : list) {
   foo.doSomething();
}

方法doSomething()需要使用实现进行定义,或在abstract中声明为ParentClass,并且可以在AB中重写以反映每个班级的具体行为。 如果您需要访问某些属性,则需要public并在ParentClass中声明。注意:这是一种很好的做法不要将属性设置为public,除非它们是常量(final)。标准方法是提供一个吸气剂。