Child ch = new Parent()
недопустимо, потому что не каждый Parent
является Child
.
Предположим, у вас был третий класс:
class AnotherChild extends Parent {int age = 2;}
Следующее также будет действительным:
Parent otherChild = new AnotherChild();
Если Cild child = new Parent()
должно быть сделано действительным, то по той же причине
Child child = new AnotherChild()
Будет ли также должно быть сделано действительным, потому что AnotherChild
является Parent
.
Теперь ясно, что это проблематично, потому что Child
отличается от AnotherChild
.
Этот пример выбран, чтобы сделать его очевидным, но даже простой объект Parent
(new Parent()
) не является экземпляром Child
, поскольку он не был создан с классом Child
или любым из его подклассы.
Все это проверки типов во время компиляции, которые обеспечивают безопасность кода и совместимость объектов / переменных. Можно использовать разрешенные приведения, чтобы обойти проблему, но если объекты времени выполнения на самом деле несовместимых типов, выполнение все равно будет неудачным.