Как я могу добавить к этому MyObj
aMap
?
Вы не можете из-за верхней границы ключа.
Причина в том, что ? extends A
может быть MyOtherObj implements A
. В этом случае было бы типа небезопасно, чтобы иметь возможность поставить ключ типа MyObj
в карте:
Map<MyOtherObj, String> anotherMap = new HashMap<>();
Map<? extends A, String> aMap = anotherMap;
aMap.put(new MyObj(), ""); // Can't do this; but if you could...
MyOtherObj obj = anotherMap.keySet().iterator().next(); // ClassCastException!
Remember аббревиатуру PECS (см this question на много более подробно):
- Производитель
extends
- Потребительское
super
другими словами, Map<? extends A, String>
может ОНЛ y используется для производят экземпляров A
, он не может принимать/принимать экземпляры A
.
Например, вы можете перебирать ключи ("продуцирующие" Ключи):
for (A a : aMap.keySet()) { ... }
карта может только "потреблять" буквальный null
:
aMap.put(null, "");
потому null
может быть отлит для любого типа без исключения. Но на карте мало пользы, которая имеет только один ключ - вы можете просто просто сохранить значение напрямую.
Единственный способ сделать этот тип-безопасно, чтобы поместить экземпляр MyObj
на карту с помощью ссылки, которые вы знаете принимает MyObj
экземпляры:
Map<MyObj, String> safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");
Map<? extends A, String> aMap = safeMap;
или
Map<A, String> safeMap = new HashMap<>();
safeMap.put(new MyObj(), "");
Map<? extends A, String> aMap = safeMap;
Но вы должны учитывать отсутствие карты с типичным шаблоном; Map<MyObj, String>
или Map<A, String>
проще.
Вам нужно разработать немного более слаженно для нас чтобы помочь вам – CraigR8806
'java.util.Map' работает на двух объектах. 'key' и' value'. Как вы хотите использовать «MyObj» ... как ключ или значение? – Azodious
«Как я могу добавить MyObj к этой aMap» Вы не можете, если ваш ключ не равен «null». –