java: HashMap <String, int> ne fonctionne pas
HashMap<String, int>
ne semble pas fonctionner, mais HashMap<String, Integer>
fonctionne. Des idées pourquoi?
Vous ne pouvez pas utiliser les types primitifs comme arguments génériques en Java. Utilisez à la place:
Map<String, Integer> myMap = new HashMap<String, Integer>();
Avec auto-boxing/unboxing , il y a peu de différence dans le code. La boxe automatique signifie que vous pouvez écrire:
myMap.put("foo", 3);
au lieu de:
myMap.put("foo", new Integer(3));
La boxe automatique signifie que la première version est implicitement convertie en seconde. Le déballage automatique signifie que vous pouvez écrire:
int i = myMap.get("foo");
au lieu de:
int i = myMap.get("foo").intValue();
L’appel implicite à intValue()
signifie que si la clé n’est pas trouvée, elle générera un NullPointerException
, par exemple:
int i = myMap.get("bar"); // NullPointerException
La raison est type effacement . Contrairement à, disons, en C #, les types génériques ne sont pas conservés au moment de l'exécution. Ce ne sont que du "sucre syntaxique" pour que le casting explicite vous sauve en faisant 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
Vous ne pouvez pas utiliser de types primitifs dans HashMap
. int
ou double
ne fonctionne pas. Vous devez utiliser son type englobant. à titre d'exemple
Map<String,Integer> m = new HashMap<String,Integer>();
Maintenant, les deux sont des objets, donc cela fonctionnera.
int est un type primitif, vous pouvez lire ce que signifie un type primitif dans Java ici , et une mappe est une interface dont les objets doivent être entrés:
public interface Map<K extends Object, V extends Object>
objet signifie une classe, et cela signifie également que vous pouvez créer une autre classe qui en sort, mais vous ne pouvez pas créer une classe qui sort de int. Donc, vous ne pouvez pas utiliser int variable comme un objet. J'ai des solutions de remorquage pour votre problème:
Map<String, Integer> map = new HashMap<>();
ou
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];