2017-01-16 1 views
0
public interface A { 
    int getA(); 
} 

public class MyObj implements A { 
    public int getA(){ 
     return 1; 
    } 
} 

Если есть карта: Map<? extends A, String> aMap = new HashMap<>();Как добавить объект в <? extends Inteface>?

Как я могу добавить к этому MyObjaMap? Или как должно быть класс MyObj так, что он может работать в этой карте

+0

Вам нужно разработать немного более слаженно для нас чтобы помочь вам – CraigR8806

+1

'java.util.Map' работает на двух объектах. 'key' и' value'. Как вы хотите использовать «MyObj» ... как ключ или значение? – Azodious

+1

«Как я могу добавить MyObj к этой aMap» Вы не можете, если ваш ключ не равен «null». –

ответ

6

Как я могу добавить к этому MyObjaMap?

Вы не можете из-за верхней границы ключа.

Причина в том, что ? 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> проще.

+1

Я бы добавил простой совет, чтобы использовать 'Map ' вместо этого. – RealSkeptic

2

Это невозможно. Ваш компилятор не допустит этого.

Вы должны изменить свою карту:

Map<A, String> aMap = new HashMap<>(); 

После этого вы можете использовать поместить, чтобы добавить элемент к нему:

aMap.put(new MyObj(), "myObject");