2012-01-11 16 views
5

así que tengo un mapa que tiene algunos valores en que se pasó a un método:Poner en un mapa <String, ?>

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

y estoy tratando de insertar un atributo Además de esto Mapa

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

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

de todos modos para llevar a cabo este puesto sin la "clonación" el Mapa:

Pero estoy recibiendo este error?

+0

¿Está tratando de crear un mapa que pueda almacenar cualquier tipo de objeto? – Perception

Respuesta

11

Si desea poner valores de tipo X en un genérico Map, necesita declarar el Map como Map<String, ? super X>. En su ejemplo X es String, por lo que:

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

Map<String, ? super X> significa: un mapa con las teclas de tipo String y valores de un tipo que es X o un supertipo de X. Todos estos mapas están dispuestos a aceptar String instancias como claves e instancias X como valores.

+1

+1, pero su último párrafo tiene un error tipográfico: quiere decir 'super' en lugar de' extends'. :-) – ruakh

+0

@ruakh De hecho. Gracias. –

+0

Agradable. Gracias. – ovaherenow

4

Recuerde PECS (Producer Extends, Consumer Super). Usted tiene un consumidor (poner en), por lo tanto, no puede ser extends.

0

Sorprendentemente podemos convertir este mapa en una forma más fácil de usar. Solo con esta sintaxis simple: (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"); 
Cuestiones relacionadas