Java 不允许我在保护伞 class 下声明对象(多态性)

Java will not allow me to declare objects under an umbrella class (polymorphism)

我正在学习多态性以及伞 class 的工作原理。我在 class "Child" 中有一个主要方法。另外四个 classes 已创建,名为 "Ralph, "Simon"、"Piggy" 和 "Jack"。我还有一个接口,这四个 classes 实现了称为"IslandAdventures",其中包含方法 trait() 和 action()。我收到一条错误消息,说要将我的对象更改为它们各自的类型 例如:拉尔夫 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();
    }
    }

假设我创建了一个继承自 Child 的新子 Foo。这意味着它可以属于列表 children。但是,Foo 没有实现 IslandAdventures。当我从列表中取出 foo 并尝试在 Foo 上调用 trait()action() 时会发生什么?

解决方案是声明一个 ArrayList<IslandAdventures>,因为所有成员都实现接口,或者让 Child 实现 IslandAdventures,以便 Child [=23] 的所有子类=]也实现它。

问题是当您说 Child one = new Ralph(); 时,您不能调用 Ralphtrait()action() 方法。 Child 类型没有声明这些方法!

打个比方:Ralph 是一款新的三星电视型号,但您购买它时使用的是旧遥控器,该遥控器仅适用于该型号的电视,因为它们都来自三星 (Child) ,并且您的遥控器没有执行电视所有功能所需的按钮。

您可以通过获取正确的遥控器来解决此问题(例如:错误提示您执行的操作,将 Child 类型更改为 Ralph 类型)或者您可以这样做,以便遥控器总是有那些按钮(在 Child 中实现 IslandAdventures)。

编辑:根据你的问题下的评论,我认为这里更大的问题是你没有在 类.

中扩展 Child