148 votes

java: HashMap <String, int> ne fonctionne pas

HashMap<String, int> ne semble pas fonctionner mais HashMap<String, Integer> fonctionne. Des idées pourquoi?

228voto

cletus Points 276888

Vous ne pouvez pas utiliser les types primitifs comme les arguments génériques en Java. Utiliser à la place:

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

Avec l'auto-boxing/unboxing il y a peu de différence dans le code. Auto-boxing signifie que vous pouvez écrire:

myMap.put("foo", 3);

au lieu de:

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

Auto-boxing désigne la première version est implicitement converti à la seconde. Auto-unboxing signifie que vous pouvez écrire:

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

au lieu de:

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

L'appel implicite à l' intValue() signifie que si la clé n'est pas trouvée, il va générer un NullPointerException, par exemple:

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

La raison en est le type d'effacement. Contrairement, disons, en C# les types génériques ne sont pas conservées lors de l'exécution. Ils sont juste "sucre syntaxique" pour une conversion explicite pour vous sauver de faire ceci:

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

Pour vous donner un exemple, ce code est parfaitement légal:

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

5voto

Peter Lawrey Points 229686

GNU Trove supporte cela mais n'utilise pas de génériques. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X