2012-01-11 14 views
5

Così ho una mappa che ha alcuni valori in esso essere passato in un metodo:Mettere in una mappa <String, ?>

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

e sto cercando di inserire un attributo Oltre a questa mappa

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

Ma sto ottenendo questo errore:

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

esiste un modo per eseguire questa put senza "clonazione" mappa?

+0

Stai cercando di creare una mappa in grado di memorizzare qualsiasi tipo di oggetto? – Perception

risposta

11

Se si desidera inserire valori di tipo X in un Map generico, è necessario dichiarare Map come Map<String, ? super X>. Nel tuo esempio X è String, quindi:

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

Map<String, ? super X> significa: una mappa con i tasti di tipo String ei valori di un tipo che è X o un super-tipo di X. Tutte queste mappe sono pronti ad accettare String istanze come chiavi e istanze X come valori.

+1

+1, ma il tuo ultimo paragrafo ha un refuso: vuoi dire 'super' piuttosto che' extends'. :-) – ruakh

+0

@ruakh Infatti. Grazie. –

+0

Bello. Grazie. – ovaherenow

4

Ricordare PECS (Producer Extends, Consumer Super). Hai un consumatore (inserendo), quindi non può essere extends.

0

Sorprendentemente possiamo convertire questa mappa in un modulo più facile da usare. Solo con questa sintassi simillegata: (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"); 
Problemi correlati