如果我有一个父对象的链接列表,如:
LinkedList<ParentClass> list = new LinkedList<ParentClass>();
我想用不同类型的子对象(所有扩展为“ParentClass”)填充它们,我将如何进行此操作。 另请注意,我不知道将使用哪个特定的子类。例如,我可以尝试:
list.add(someInstanceOfAChildClass);
然后能够访问该子类中的方法和属性。 如果我没有明白我的意思,我可以澄清一下。 提前谢谢!
答案 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 {...}
您只需要将A
和B
的实例添加到列表中,例如
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
,并且可以在A
和B
中重写以反映每个班级的具体行为。
如果您需要访问某些属性,则需要public
并在ParentClass
中声明。注意:这是一种很好的做法不要将属性设置为public
,除非它们是常量(final
)。标准方法是提供一个吸气剂。