2016-12-23 3 views
5

Я стараюсь в этом обратное приведение образом:(Java downcasting) Что я сделал неправильно в этом примере?

public static void main(String[] args){ 
    Animal a = new Animal(); 
    ((Cat)a).makePee(); 
} 

Cat расширяет Animal и оба имеют один и тот же метод makePee(). Если я пытаюсь запустить это, компилятор показывает мне сообщение об ошибке:

Исключение в потоке «основной» java.lang.ClassCastException: Животное не может быть приведен к Cat на Main.main (Main.java: 6)

Но в примере приложения Lern ​​Java показана действительно так же, как и я.

+2

Это очень хорошо написанный вопрос, но «пример приложения Lern ​​Java показан действительно так же, как и я», просто не может быть правдой. – Bathsheba

ответ

6

Ну, a не является примером Cat. Если вы хотите, чтобы обратное приведение его к Cat, вам нужно на самом деле создать Cat (или экземпляр некоторого класса, который простирается Cat, конечно):

Animal a = new Cat(); 

Заметим, однако, что если Animal объявляет makePee() и Cat переопределяет его, опустошение бессмысленно. Вы можете просто позвонить a.makePee(), и будет использована реализация Cat (если вы действительно создали Cat, как указано выше).