Подтвердить что ты не робот

Почему это компилируется?

Сегодня я был ошеломлен, когда отлаживал какой-то код, чтобы обнаружить, что что-то вроде следующего не выбрасывает исключение во время компиляции:

 public Test () { 
     HashMap map = (HashMap) getList(); 
 }

 private List getList(){
     return new ArrayList();
 }

Как вы можете себе представить, a ClassCastException вызывается во время выполнения, но может ли кто-нибудь объяснить, почему кастинг List на HashMap считается законным во время компиляции?

4b9b3361

Ответ 1

Потому что возможно getList() может возвращать подкласс HashMap, который также реализует List. Маловероятно, да, но возможно и, следовательно, компилируемо.

Ответ 2

С одной стороны, List - это интерфейс. Нет причин, по которым не может существовать подкласс HashMap, который также реализует интерфейс List. В этой ситуации это было бы совершенно справедливо.