Java不允许我在伞类下声明对象(多态)

时间:2015-04-16 00:40:30

标签: java oop polymorphism

我正在学习多态性以及伞类如何工作。我有一个主要方法,在课堂上#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();
    }
    }

2 个答案:

答案 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

编辑:根据你提问的评论,我认为这里更大的问题是你没有在课堂上扩展孩子。