2012-01-11 12 views
5

więc mam mapę, która ma pewne wartości w nim jest przekazywana do metody:Umieszczenie na Mapie <String, ?>

public String doThis(Map<String, ?> context){ 
..... 
} 

I próbuję wstawić atrybut Poza tą mapą

String abc="123"; 
context.put("newAttr",abc); 

Ale ja dostaję ten błąd:

The method put(String, capture#8-of ?) in the type Map is not applicable for the arguments (String, String)

Czy mimo to aby wykonać tę put bez „klonowanie” mapę?

+0

Czy próbujesz utworzyć mapę, która może przechowywać dowolny obiekt? – Perception

Odpowiedz

11

Jeśli chcesz umieścić wartości typu X w ogólnym Map, musisz zadeklarować Map jako Map<String, ? super X>. W przykładzie X jest String, więc:

public String doThis(Map<String, ? super String> context){ 
..... 
} 

Map<String, ? super X> oznacza: mapa z klawiszami typu String i wartości typu, który jest X lub super-rodzaj X. Wszystkie te mapy są gotowi zaakceptować String instances jako klucze i wystąpienia X jako wartości.

+1

+1, ale twój ostatni akapit ma literówkę: masz na myśli 'super' zamiast' extends'. :-) – ruakh

+0

@ruakh Rzeczywiście. Dzięki. –

+0

Nice. Dziękuję Ci. – ovaherenow

4

Pamiętaj o PECS (producent przedłuża, konsument super). Masz konsumenta (wprowadzenie), dlatego nie może być extends.

0

Zaskakująco możemy przekształcić tę mapę w łatwiejszy w użyciu formularz. Właśnie z tą składnią simiple: (Map<String, ObjectOrSth>)unfriendlyMap.

// Let's get this weird map. 
HashMap<String, String> mapOrig = new HashMap<String, String>(); 
Map<String, ?> mapQuestion = (Map<String, ?>)mapOrig; 
//mapQuestion.put("key2", "?"); // impossible 

// Convert it to almost anything... 
Map<String, String> mapStr2 = (Map<String, String>)mapQuestion; 
mapStr2.put("key2", "string2"); 
assertThat(mapOrig.get("key2")).isEqualTo("string2"); 
Map<String, Object> mapObj = (Map<String, Object>)mapQuestion; 
mapObj.put("key3", "object"); 
assertThat(mapOrig.get("key3")).isEqualTo("object"); 
Powiązane problemy