java: HashMap <String, int> no funciona

128

HashMap<String, int>no parece funcionar pero HashMap<String, Integer>funciona. Alguna idea de por qué?

gklots
fuente
Su elección de palabras para su pregunta es confusa, ¿puede aclarar? Y exactamente lo que no funciona, ¿puedes publicar el código?
Anthony Forloney el

Respuestas:

203

No puede usar tipos primitivos como argumentos genéricos en Java. Use en su lugar:

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

Con auto-boxing / unboxing hay poca diferencia en el código. El auto-boxeo significa que puedes escribir:

myMap.put("foo", 3);

en vez de:

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

El auto-boxeo significa que la primera versión se convierte implícitamente en la segunda. El desempaquetado automático significa que puede escribir:

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

en vez de:

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

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

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

La razón es el tipo de borrado . A diferencia, por ejemplo, en C #, los tipos genéricos no se retienen en tiempo de ejecución. Son simplemente "azúcar sintáctico" para un casting explícito que te ahorrará hacer esto:

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

Para darle 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");
cletus
fuente
3
Su último ejemplo no funciona: no se puede
transmitir
teniendo en cuenta cada código separado en una nueva línea, el código de la línea 5 primero se debe convertir a Integer antes de usar el método intValue () porque se considera un objeto cuando se usa el método get ().
estudiante nuevo
2

No puede usar tipos primitivos en HashMap. into doubleno funciona. Tienes que usar su tipo envolvente. para un ejemplo

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

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


fuente
0

int es un tipo primitivo, puede leer lo que significa un tipo primitivo en java aquí , y un mapa es una interfaz que tiene objetos como entrada:

public interface Map<K extends Object, V extends Object>

objeto significa una clase, y también significa que puede crear otra clase que se ejecute a partir de ella, pero no puede crear una clase que se ejecute desde int. Por lo tanto, no puede usar la variable int como un objeto. Tengo soluciones de remolque para su problema:

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

o

Map<String, int[]> map = new HashMap<>();
int x = 1;

//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);

//get the value of x
int y = map.get("x")[0];
Younes Meridji
fuente
-3

Puede usar el tipo de referencia en argumentos genéricos, no el tipo primitivo. Así que aquí deberías usar

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

y almacenar valor como

myMap.put("abc", 5);
Chitrapal Singh
fuente
1
Esto no responde a la pregunta
smac89