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();
时,您不能调用 Ralph
的 trait()
或 action()
方法。 Child 类型没有声明这些方法!
打个比方:Ralph
是一款新的三星电视型号,但您购买它时使用的是旧遥控器,该遥控器仅适用于该型号的电视,因为它们都来自三星 (Child
) ,并且您的遥控器没有执行电视所有功能所需的按钮。
您可以通过获取正确的遥控器来解决此问题(例如:错误提示您执行的操作,将 Child
类型更改为 Ralph
类型)或者您可以这样做,以便遥控器总是有那些按钮(在 Child
中实现 IslandAdventures
)。
编辑:根据你的问题下的评论,我认为这里更大的问题是你没有在 类.
中扩展 Child
我正在学习多态性以及伞 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();
时,您不能调用 Ralph
的 trait()
或 action()
方法。 Child 类型没有声明这些方法!
打个比方:Ralph
是一款新的三星电视型号,但您购买它时使用的是旧遥控器,该遥控器仅适用于该型号的电视,因为它们都来自三星 (Child
) ,并且您的遥控器没有执行电视所有功能所需的按钮。
您可以通过获取正确的遥控器来解决此问题(例如:错误提示您执行的操作,将 Child
类型更改为 Ralph
类型)或者您可以这样做,以便遥控器总是有那些按钮(在 Child
中实现 IslandAdventures
)。
编辑:根据你的问题下的评论,我认为这里更大的问题是你没有在 类.
中扩展 Child