我正在学习多态性以及伞类如何工作。我有一个主要方法,在课堂上#34; Child"。还创建了另外四个类,称为" Ralph," Simon"," Piggy"和" Jack"。我还有一个接口,这四个类实现称为" IslandAdventures",它包含方法trait()和action()。我得到一个错误说要将我的对象更改为各自的类型 例如:Ralph ralph = new Ralph();
代码:
public static void main(String [] args)
{
Child ralph = new Ralph();
Child piggy = new Piggy();
Child jack = new Jack();
Child simon = new Simon();
ArrayList<Child> children = new ArrayList<Child>();
children.add(ralph);
children.add(piggy);
children.add(jack);
children.add(simon);
for (Child child : children)
{
child.trait();
child.action();
}
}
答案 0 :(得分:2)
想象一下,我创建了一个继承自Child
的新子Foo。这意味着它可以属于列表children
。但是,Foo没有实现IslandAdventures
。当我从列表中获取foo并尝试在Foo上调用trait()
和action()
时会发生什么?
解决方案是声明ArrayList<IslandAdventures>
,因为所有成员都实现了接口,或者Child
实现了IslandAdventures
,因此Child
的所有子类也< / em>实现它。
答案 1 :(得分:2)
问题在于,当您说Child one = new Ralph();
时,您无法拨打Ralph
的{{1}}或trait()
方法。 Child类型没有声明这些方法!
类比:action()
是一款全新的三星电视机型,但是您购买了一台仅适用于该型号电视的旧遥控器,因为它们都来自三星(Ralph
) ,您的遥控器没有必要的按钮来完成电视的所有功能。
您可以通过获取正确的遥控器来解决此问题(例如:错误说明要做什么,将Child
类型更改为Child
类型),或者您可以将其设置为使遥控器始终具有这些按钮(在Ralph
中实施IslandAdventures
。
编辑:根据你提问的评论,我认为这里更大的问题是你没有在课堂上扩展孩子。