Ответ 1
Потому что возможно getList()
может возвращать подкласс HashMap
, который также реализует List
. Маловероятно, да, но возможно и, следовательно, компилируемо.
Сегодня я был ошеломлен, когда отлаживал какой-то код, чтобы обнаружить, что что-то вроде следующего не выбрасывает исключение во время компиляции:
public Test () {
HashMap map = (HashMap) getList();
}
private List getList(){
return new ArrayList();
}
Как вы можете себе представить, a ClassCastException
вызывается во время выполнения, но может ли кто-нибудь объяснить, почему кастинг List
на HashMap
считается законным во время компиляции?
Потому что возможно getList()
может возвращать подкласс HashMap
, который также реализует List
. Маловероятно, да, но возможно и, следовательно, компилируемо.
С одной стороны, List - это интерфейс. Нет причин, по которым не может существовать подкласс HashMap, который также реализует интерфейс List. В этой ситуации это было бы совершенно справедливо.