在预期超类时返回Java中的子类

ash*_*999 0 java polymorphism inheritance

编辑:这没用,因为我有:

class Animal { ... }
class Horse extends Animal { ... }
class Unicorn extends **Animal** { ... }
Run Code Online (Sandbox Code Playgroud)

很明显,这是一个错字,独角兽应该延伸马,而不是动物.在这里,我以为我在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?!";
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译:

public Horse getHorse() {
  return new Unicorn(); // Doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

我在Eclipse下使用JRE或JSE 1.6获得编译错误"无法从Unicorn转换为Horse".

为什么不编译?每只独角兽也是一匹马,因此,我正在返回一个有效的马匹实例......不是吗?

我的问题是关于多态如何在Java中工作.我希望这能奏效.对于它的价值,这段代码在.NET 2.0中编译(也许这就是为什么我希望它也能在Java中工作).

Luk*_*der 7

你是否完全像这样写了?因为你不能在类定义中使用括号...例如

public class Horse() {
Run Code Online (Sandbox Code Playgroud)

应该

public class Horse {
Run Code Online (Sandbox Code Playgroud)

public class Unicorn extends Horse() {
Run Code Online (Sandbox Code Playgroud)

应该

public class Unicorn extends Horse {
Run Code Online (Sandbox Code Playgroud)

  • 不想咆哮或任何事情(我实际上赞成这个答案),但是将此标记为正确只会对操作过相同问题的人造成更多混淆,因为这实际上并不是正确的解决方案,OP实际上是继承的来自不同的班级. (2认同)