web-dev-qa-db-fra.com

java: HashMap <String, int> ne fonctionne pas

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

118
gklots

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

GNU Trove supporte cela mais n'utilise pas de génériques. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html

3
Peter Lawrey

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.

2
user6811894

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];
0
Younes Meridji