Проблема в том, что вы не используете кастинг должным образом.Класс всегда может быть приведен в качестве его родителя, но не наоборот.Концепция заключается в том, что дочерний класс (по определению) знает структуру родителя и (по определению) уже поддерживает все подписи в родительском элементе.Следовательно, родитель является подмножеством дочернего элемента.
Обратное, однако, неверно.Родительский класс ничего не знает о дочернем классе и / или о том, добавил ли дочерний элемент дополнительные сигнатуры в его структуру.Следовательно, нет никакого способа сказать компилятору рассматривать родителя как ребенка и сделать доступным все методы, которые ребенок имеет в родителе.
Говорят, что вода (ребенок) - это жидкость (родитель)), но не все жидкости являются водой.Следовательно, любые измерения, которые вы хотите выполнить для жидкостей (например, количество, вязкость и т. Д.), Также применимы и к воде, но не наоборот (например, плотность воды полностью отличается от плотности нефти).
Итак, чтобы вернуть все это к вашей ситуации, вы можете разыграть Subclass
как Skillbase
, но не наоборот.
Subclass instanceof Skillbase == true
(Skillbase) new Subclass() - also valid
(SKillbase) new Sub#2 - also valid
и т. Д. *