Исключение приведения классов в Java - PullRequest
0 голосов
/ 27 января 2012

У меня проблема с приведением классов друг к другу.

Чтобы объяснить это более подробно, взгляните на это изображение.

The Image

В моем коде я делаю SkillBase s = new SkillBase(); и затем устанавливаю некоторые значения в этом классе.Затем я пытаюсь сделать Subclass sub = (Subclass)s;, но при запуске он выдает ClassCastException.

Я добавил небольшую отладочную часть, которая проверяет, является ли она instanceof, которая возвращает true.

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

Итак, что мне делать?

Ответы [ 5 ]

5 голосов
/ 27 января 2012

SkillBase не является экземпляром Subclass, так почему вы думаете, что приведение в действие будет работать?Попробуйте с этим:

SkillBase s = new Subclass();
Subclass sub = (Subclass)s;

, который будет успешным.Также я думаю, что вы не правы с instanceof, я уверен, что:

s instanceof Subclass

дает true в приведенном выше коде, но false в вашем случае.

Мышлениев реальном мире: вы всегда можете привести Dog к Animal, потому что каждая собака - животное *, но приведение Animal к Dog может закончиться неудачей, поскольку некоторые животные не являются собаками.

* на самом деле, компилятор сделает это за вас, он известен как полиморфизм

0 голосов
/ 27 января 2012

Проблема в том, что вы не используете кастинг должным образом.Класс всегда может быть приведен в качестве его родителя, но не наоборот.Концепция заключается в том, что дочерний класс (по определению) знает структуру родителя и (по определению) уже поддерживает все подписи в родительском элементе.Следовательно, родитель является подмножеством дочернего элемента.

Обратное, однако, неверно.Родительский класс ничего не знает о дочернем классе и / или о том, добавил ли дочерний элемент дополнительные сигнатуры в его структуру.Следовательно, нет никакого способа сказать компилятору рассматривать родителя как ребенка и сделать доступным все методы, которые ребенок имеет в родителе.

Говорят, что вода (ребенок) - это жидкость (родитель)), но не все жидкости являются водой.Следовательно, любые измерения, которые вы хотите выполнить для жидкостей (например, количество, вязкость и т. Д.), Также применимы и к воде, но не наоборот (например, плотность воды полностью отличается от плотности нефти).

Итак, чтобы вернуть все это к вашей ситуации, вы можете разыграть Subclass как Skillbase, но не наоборот.

Subclass instanceof Skillbase == true
(Skillbase) new Subclass() - also valid
(SKillbase) new Sub#2 - also valid

и т. Д. *

0 голосов
/ 27 января 2012

s нельзя привести к Подклассу, потому что он не был создан как Подкласс. Это Skillbase. Если вы хотите использовать подкласс, почему бы просто не создать его экземпляр?

Subclass s = new Subclass();

Вы все еще можете установить нужные параметры, потому что они унаследованы Skillbase и приведение больше не требуется.

0 голосов
/ 27 января 2012

Возможно, вы используете instanceof неправильно.

Время выполнения подходит к ошибке, так как SkillBase не Subclass.

Верно наоборот.

0 голосов
/ 27 января 2012

Вы можете только повышать, то есть присваивать подклассы ссылкам на суперклассы.Подумайте об этом так: Subclass расширяет Superclass, добавляя новый метод f().Теперь Superclass не знает ничего о f () и, следовательно, о проблеме.

...