Во время работы над вопросами интервью я столкнулся с ниже кодом:
List<Object> list = new ArrayList();
Map<Object, ? super ArrayList> m = new HashMap<Object, ArrayList>();
m.put(1, new Object());
m.put(2, list);
Вышеуказанный метод put бросает ошибку времени компиляции. Но когда я добавляю m.put(3, new ArrayList());
, он добавляет к карте без ошибки времени компиляции.
Для меня очень ясно, что я могу добавить new Object()
как значение в HashMap
из-за того, что объявление карты имеет тип < ? super ArrayList>
; это означает, что я могу добавить любое значение, превышающее ArrayList
(т.е. super of ArrayList
) и ArrayList
объект, но ничего не ниже ArrayList
.
Эта конкретная концепция очень хорошо написана в SCJP 6 Кэти Сьеррой и Берт Бейтс, и на основе этой теории и примеров я предположил, что она должна выполнять работу, как я понял. Может кто-нибудь помочь мне понять ошибку?