java: HashMap <String, int> ne fonctionne pas


128

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


votre choix de mots pour votre question est déroutant, pouvez-vous clarifier? Et exactement ce qui ne fonctionne pas, pouvez-vous poster le code?
Anthony Forloney

Réponses:


203

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");

3
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 ().
apprenant frais


2

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 = new HashMap<String,Integer>();

Maintenant, les deux sont des objets, donc cela fonctionnera.


0

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];

-3

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);

1
Cela ne répond pas à la question
smac89
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.