2009-11-22 10 views
107

HashMap<String, int> parece que no funciona, pero HashMap<String, Integer> funciona. ¿Alguna idea de por qué?java: HashMap <String, int> no funciona

+0

la elección de palabras para su pregunta es confusa, ¿puede aclarar? Y exactamente lo que no funciona, ¿puedes publicar el código? –

+7

@aforloney - claramente este es un error de compilación. –

Respuesta

171

No se pueden usar tipos primitivos como argumentos genéricos en Java. Utilizar en su lugar:

Map<String, Integer> myMap = new HashMap<String, Integer>(); 

Con auto-boxing/unboxing hay poca diferencia en el código. Auto-boxing significa que puede escribir:

myMap.put("foo", 3); 

en lugar de:

myMap.put("foo", new Integer(3)); 

auto-boxing significa la primera versión se convierte implícitamente a la segunda. Auto-unboxing significa que puede escribir:

int i = myMap.get("foo"); 

en lugar de:

int i = myMap.get("foo").intValue(); 

La llamada implícita a intValue() significa que si no se encuentra la clave que va a generar un NullPointerException, por ejemplo:

int i = myMap.get("bar"); // NullPointerException 

La razón es type erasure. A diferencia, por ejemplo, en C#, los tipos genéricos no se conservan en el tiempo de ejecución. Ellos son sólo "azúcar sintáctico" para la conversión explícita a guardar los haces esto:

Integer i = (Integer)myMap.get("foo"); 

Para dar un ejemplo, este código es perfectamente legal:

Map<String, Integer> myMap = new HashMap<String, Integer>(); 
Map<Integer, String> map2 = (Map<Integer, String>)myMap; 
map2.put(3, "foo"); 
+3

Su último ejemplo no funciona: No se puede convertir desde Map a Map T3rm1

+0

¿Por qué no funciona con 'Float' y' Double'? –

+0

teniendo en cuenta cada código por separado en una nueva línea, el código en la línea 5 se debe convertir primero en Entero antes de usar el método intValue() porque se considera como un objeto cuando se usa el método get(). –

-2

Puede usar el tipo de referencia en argumentos genéricos, no en tipo primitivo. Así que aquí se debe utilizar

Map<String, Integer> myMap = new HashMap<String, Integer>(); 

y almacenar valor como

myMap.put("abc", 5); 
+1

Esto no responde a la pregunta – smac89

+0

@ Smac89 No creo que esto responda correctamente la pregunta tampoco, pero es una respuesta.Entonces, la forma correcta de lidiar con esto es bajonear, no marcar. –

2

No puede utilizar tipos primitivos en HashMap. int, o double no funcionan. Tienes que usar su tipo adjunto. para un ejemplo

Map<String,Integer> m = new HashMap<String,Integer>(); 

Ahora ambos son objetos, así que esto funcionará.

Cuestiones relacionadas