Java: HashMap <String, int> funktioniert nicht

128

HashMap<String, int>scheint nicht zu funktionieren, HashMap<String, Integer>funktioniert aber . Irgendwelche Ideen warum?

gklots
quelle
Ihre Wortwahl für Ihre Frage ist verwirrend. Können Sie das klarstellen? Und genau das, was nicht funktioniert, können Sie den Code posten?
Anthony Forloney

Antworten:

203

Sie können in Java keine primitiven Typen als generische Argumente verwenden. Verwenden Sie stattdessen:

Map<String, Integer> myMap = new HashMap<String, Integer>();

Beim Auto-Boxing / Unboxing gibt es kaum Unterschiede im Code. Auto-Boxing bedeutet, dass Sie schreiben können:

myMap.put("foo", 3);

anstatt:

myMap.put("foo", new Integer(3));

Auto-Boxing bedeutet, dass die erste Version implizit in die zweite konvertiert wird. Auto-Unboxing bedeutet, dass Sie schreiben können:

int i = myMap.get("foo");

anstatt:

int i = myMap.get("foo").intValue();

Der implizite Aufruf von intValue()bedeutet, dass der Schlüssel, wenn er nicht gefunden wird, Folgendes generiert NullPointerException:

int i = myMap.get("bar"); // NullPointerException

Der Grund ist das Löschen des Typs . Anders als beispielsweise in C # werden generische Typen zur Laufzeit nicht beibehalten. Sie sind nur "syntaktischer Zucker" für explizites Casting, um Ihnen dies zu ersparen:

Integer i = (Integer)myMap.get("foo");

Um Ihnen ein Beispiel zu geben, dieser Code ist vollkommen legal:

Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");
Cletus
quelle
3
Ihr letztes Beispiel funktioniert nicht: Kann nicht von Map <String, Integer> in Map <Integer, String> umgewandelt werden
T3rm1
Wenn Sie jeden einzelnen Code in einer neuen Zeile berücksichtigen, muss der Code in Zeile 5 vor der Verwendung der intValue () -Methode zuerst in Integer umgewandelt werden, da er bei Verwendung der get () -Methode als Objekt betrachtet wird.
Frischlerner
2

Sie können in keine primitiven Typen verwenden HashMap. intoder doublenicht arbeiten. Sie müssen den umschließenden Typ verwenden. zum Beispiel

Map<String,Integer> m = new HashMap<String,Integer>();

Jetzt sind beide Objekte, also wird dies funktionieren.


quelle
0

int ist ein primitiver Typ, können Sie lesen , was bedeutet das eine primitive Art in Java hier , und eine Karte ist eine Schnittstelle, die auf Objekte als Eingabe hat:

public interface Map<K extends Object, V extends Object>

Objekt bedeutet eine Klasse, und es bedeutet auch, dass Sie eine andere Klasse erstellen können, die von ihr ausgeht, aber Sie können keine Klasse erstellen, die von int ausgeht. Sie können also die Variable int nicht als Objekt verwenden. Ich habe zwei Lösungen für Ihr Problem:

Map<String, Integer> map = new HashMap<>();

oder

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

Sie können den Referenztyp in generischen Argumenten verwenden, nicht den primitiven Typ. Also hier solltest du verwenden

Map<String, Integer> myMap = new HashMap<String, Integer>();

und Wert speichern als

myMap.put("abc", 5);
Chitrapal Singh
quelle
1
Dies beantwortet nicht die Frage
smac89