【发布时间】:2013-05-29 16:20:12
【问题描述】:
我正在重构一个巨大的 if 语句。我发现改进它的方法之一是使用多态性和继承。以一种非常简化的方式,这就是我的代码中的内容:
public abstract class Animal {
public abstract void doAction();
}
public class Dog extends Animal {
public void doAction() {System.out.println("run");}
}
public class Cat extends Animal {
public void doAction() {System.out.println("sleep");}
}
public class RunActions {
public void runAction(Dog d) {
d.doAction();
}
public void runAction(Cat c) {
c.doAction();
}
}
public class Start {
public static void main(String args[]) {
Animal animal = new Dog();
new RunActions().runAction(animal); // Problem!
}
}
我知道,我知道。我可以打电话给animal.doAction();。或者在 RunActions 中添加一个接收 Animal 作为参数的方法。
但为什么编译器不允许我调用最后一行“runAction(animal)”? JVM 不应该在运行时找出 animal 是 Dog 的一个实例吗?
它不允许我这样做有什么具体原因吗?
编辑:忘记让 Dog 和 Cat 扩展 Animal。固定。
【问题讨论】:
-
请参阅JLS。它解释了一切。
标签: java inheritance polymorphism