Редактировать: Это не сработало, потому что у меня было:
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).