HashMap<String, int>
ne semble pas fonctionner mais HashMap<String, Integer>
fonctionne. Des idées pourquoi?
Réponses
Trop de publicités?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");
GNU Trove supporte cela mais n'utilise pas de génériques. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html