Возврат подкласса в Java, когда ожидается суперкласс - PullRequest
0 голосов
/ 11 февраля 2011

Редактировать: Это не сработало, потому что у меня было:

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
}

Я получаю ошибку компиляции «Невозможно конвертировать из Unicorn в Horse» в Eclipse с использованием JRE или JSE 1.6.

Почему не компилируется? Каждый единорог также является лошадью, и поэтому я возвращаю действительный экземпляр лошади ... не так ли?

Мой вопрос на самом деле о том, как полиморфизм работает в Java. Я ожидаю, что это сработает. Что бы это ни стоило, этот код компилируется в .NET 2.0 (возможно, поэтому я ожидаю, что он будет работать и в Java).

Ответы [ 3 ]

7 голосов
/ 11 февраля 2011

Вы написали это именно так?потому что вы не можете иметь скобки в определениях классов ... например

public class Horse() {

должно быть

public class Horse {

также

public class Unicorn extends Horse() {

должно быть

public class Unicorn extends Horse {
2 голосов
/ 11 февраля 2011

Работает как положено:

See it in action

Возможно, ваша ошибка, если оба класса определены в одном и том же исходном файле.

В файле должен быть только один открытый класс (или, как в моем случае, много не публичных)

Но без точного сообщения об ошибке остается только предположение.

1 голос
/ 11 февраля 2011

Это работает:

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

Это принципиально не отличается от того, что вы утверждаете, что делаете, поэтому ваша проблема должна быть в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...