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

时间:2011-02-11 15:44:47

标签: java inheritance polymorphism

编辑:这不起作用,因为我有:

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中工作)。

3 个答案:

答案 0 :(得分:7)

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

public class Horse() {

应该是

public class Horse {

public class Unicorn extends Horse() {

应该是

public class Unicorn extends Horse {

答案 1 :(得分:2)

按预期工作:

See it in action

可能是您的错误,您是否在同一源文件中定义了两个类。

每个文件应该只有一个公共类(或者在我的情况下,许多非公开类)

但是,没有确切的错误消息只是推测。

答案 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();
    }
}

这与你声称的做法并没有根本的不同,所以你的问题必须在其他地方。