Как работает downcasting?

Рейтинг: 2Ответов: 1Опубликовано: 05.03.2023

У меня есть 2 класса C1 и C2 (C2 наследует C1). Явным образом С1 привести к C2 я привести не могу:

C2 l = (C2) new C1(5);

Но можно так:

C2 c2 = new C2(5);

C1 c1 = c2;

C2 c21 =(C2) c1;

Вопрос: когда мы ссылке на класс C1 присваиваем значение ссылки c2 - это понятно, дочерний класс может "сузиться" до родительского. Но когда мы присваиваем ссылке с21 приведённую к С2 ссылку на класс C1 почему такое приведение срабатывает, ведь у нас с1 это по сути ссылка на родительский класс, как он может "расшириться" до дочернего?

Ответы

▲ 3Принят

В первом случае во время исполнения выбрасывается ClassCastException, так как был создан экземпляр родительского класса, который нельзя присвоить классу-потомку, так как у такого экземпляра нет функционала требуемого класса-потомка.

А во втором случае имеется реально созданный экземпляр класса-потомка C2, поэтому "обратное" приведение типа от предка к потомку C2 c21 = (C2) c1; отработает корректно.