Réponses:
Vous ne pouvez pas utiliser de types primitifs comme arguments génériques en Java. Utilisez à 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. La boxe automatique signifie que vous pouvez écrire:
myMap.put("foo", 3);
au lieu de:
myMap.put("foo", new Integer(3));
Auto-boxing 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, il générera un NullPointerException
, par exemple:
int i = myMap.get("bar"); // NullPointerException
La raison en est l' effacement de type . Contrairement, par exemple, 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 un casting explicite pour vous éviter 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 prend en charge 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 en java ici , et une carte est une interface qui a des objets en entrée:
public interface Map<K extends Object, V extends Object>
object 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 part de int. Vous ne pouvez donc pas utiliser la variable int comme 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];
Vous pouvez utiliser le type de référence dans les arguments génériques, pas le type primitif. Alors ici, vous devriez utiliser
Map<String, Integer> myMap = new HashMap<String, Integer>();
et stocker la valeur comme
myMap.put("abc", 5);