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",newInteger(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:
Votre dernier exemple ne fonctionne pas: impossible de convertir de Map <String, Integer> en Map <Integer, String>
T3rm1
en considérant chaque code séparé dans une nouvelle ligne, le code de la ligne 5 doit d'abord être converti en Integer avant d'utiliser la méthode intValue () car il est considéré comme un objet lorsque vous utilisez la méthode get ().
Vous ne pouvez pas utiliser de types primitifs dans HashMap. int, ou doublene fonctionne pas. Vous devez utiliser son type englobant. à titre d'exemple
Map<String,Integer> m =newHashMap<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:
publicinterfaceMap<K extendsObject, V extendsObject>
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 =newHashMap<>();
ou
Map<String,int[]> map =newHashMap<>();int x =1;//put x in mapint[] x_ =newint[]{x};
map.put("x", x_);//get the value of xint y = map.get("x")[0];
Réponses:
Vous ne pouvez pas utiliser de types primitifs comme arguments génériques en Java. Utilisez à la place:
Avec l' auto-boxing / unboxing, il y a peu de différence dans le code. La boxe automatique signifie que vous pouvez écrire:
au lieu de:
Auto-boxing signifie que la première version est implicitement convertie en seconde. Le déballage automatique signifie que vous pouvez écrire:
au lieu de:
L'appel implicite à
intValue()
signifie que si la clé n'est pas trouvée, il générera unNullPointerException
, par exemple: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:
Pour vous donner un exemple, ce code est parfaitement légal:
la source
GNU Trove prend en charge cela mais n'utilise pas de génériques. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
la source
Vous ne pouvez pas utiliser de types primitifs dans
HashMap
.int
, oudouble
ne fonctionne pas. Vous devez utiliser son type englobant. à titre d'exempleMaintenant, les deux sont des objets, donc cela fonctionnera.
la source
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:
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:
ou
la source
Vous pouvez utiliser le type de référence dans les arguments génériques, pas le type primitif. Alors ici, vous devriez utiliser
et stocker la valeur comme
la source