编辑:这不起作用,因为我有:
class Animal { ... }
class Horse extends Animal { ... }
class Unicorn extends **Animal** { ... }
显然,这是一个错字,独角兽应该延伸马,而不是动物。在这里,我以为我在Java的多态性中找到了一个漏洞!
也许这只是我,但这没有意义。我们假设我有两个Java,Horse和Unicorn类(它是Horse的子类):
public class Horse {
public String speak() {
return "Wow, a talking horse!";
}
}
public class Unicorn extends Horse {
@Override
public String speak() {
return "Unicorns really exist?!";
}
}
此代码无法编译:
public Horse getHorse() {
return new Unicorn(); // Doesn't compile
}
我在Eclipse下使用JRE或JSE 1.6获得编译错误“无法从Unicorn转换为Horse”。
为什么不编译?每一只独角兽也都是一匹马,因此,我正在返回一个有效的马的例子......不是吗?
我的问题是关于多态如何在Java中工作。我希望这能奏效。为了它的价值,这段代码在.NET 2.0中编译(也许这就是为什么我希望它也能在Java中工作)。
答案 0 :(得分:7)
你写得完全像这样吗?因为你不能在类定义中使用括号...例如
public class Horse() {
应该是
public class Horse {
也
public class Unicorn extends Horse() {
应该是
public class Unicorn extends Horse {
答案 1 :(得分:2)
按预期工作:
可能是您的错误,您是否在同一源文件中定义了两个类。
每个文件应该只有一个公共类(或者在我的情况下,许多非公开类)
但是,没有确切的错误消息只是推测。
答案 2 :(得分:1)
这有效:
public class Test {
public static class Horse {
public void speak() {
System.out.println("I'm a horse");
}
}
public static class Unicorn extends Horse {
public void speak() {
System.out.println("I'm a unicorn");
}
}
public static void main(String[] args) {
getHorse().speak();
}
public static Horse getHorse() {
return new Unicorn();
}
}
这与你声称的做法并没有根本的不同,所以你的问题必须在其他地方。