2009-12-17 13 views
10

Tengo un método que devuelve un map definido como:Problema en el mapa genérico con comodín

public Map<String, ?> getData(); 

La implementación real de este método no es claro para mí, pero, cuando intento hacer:

obj.getData().put("key","value") 

consigo siguiente mensaje de error de compilación tiempo: (¿cadena, captura # 9-de)

El método put en el Mapa no es aplicable para los argumentos (String, String)

¿Cuál es el problema? ¿String no es de tipo nada?

Gracias de antemano.

+0

gracias por las respuestas .. estoy impresionado de lo rápido que reaccionó ... muchas gracias – mmoossen

Respuesta

9

El comodín significa "el parámetro de tipo de valor puede ser cualquier cosa" - que no significa "que puede utilizar esto como si se tratara de cualquier cosa que quiero que sea ". En otras palabras, un Map<String, UUID> es válido como Map<String, ?> - pero no le gustaría poder poner un valor String en él.

Si desea un mapa que sin duda puede aceptar valores de cadena, que desea:

Map<String, ? super String> 
+4

La clase de cadena es final, por lo que simplemente Map nybon

-2

[EDITAR] Esto está realmente mal ... Lo entendí.

Mi primera respuesta fue:

Eso es java: String no es un objeto.

intento con

obj.getData().put("key",new String("value")); 

Pero cadena expande Object ... mientras yo pensaba era una cadena primitiva. Aprendí algo ^^

+3

Una cadena ciertamente * es * un objeto. ¿Qué diferencia precisa crees que haría llamar explícitamente al constructor String en este caso? –

+0

Cadena no es un tipo primitivo, ¿verdad? – enguerran

+0

No, no es un tipo primitivo ... ¿por qué afirma que no es un objeto? –

0

Prueba esto:

public Map<String, Object> getData(); 
14

El tipo de retorno de

Map<String, ?> 

es lo mismo que

Map<String, ? extends Object> 

Los medios que el tipo concreto devuelto podría ser Map<String, AnyClass>. No puede poner un String en un AnyClass, de ahí el error.

Un buen principio general es no usar comodines en los tipos de devolución de métodos.

3

Map<String, ?> es una forma abreviada de Map<String,? extends Object> y no significa que se pueda agregar nada como valor. Dice que el objeto Map puede tener cualquier tipo de valor genérico que se extienda Object.

Esto significa que el objeto Map también puede ser HashMap<String, String> o HashMap<String, Integer>. Debido a que el compilador no puede verificar qué tipos de valores serán aceptados, no le permitirá llamar a los métodos con el tipo de valor como parámetro.

Nota:

  • Usted puede llamar a los métodos con el tipo de valor como valor de retorno, porque todo debe extenderse a objetos (? Expande Object)
  • Un Map<String, ? super String> tendrá el efecto contrario: Siempre se puede usar un parámetro String como, pero el tipo de retorno no está claro.
Cuestiones relacionadas