2009-11-22 7 views
107

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

+0

Ihre Wortwahl für Ihre Frage ist verwirrend, können Sie klären? Und genau was nicht funktioniert, können Sie den Code posten? –

+7

@aforloney - eindeutig ist dies ein Kompilierungsfehler. –

Antwort

171

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

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

Mit auto-boxing/unboxing es kaum einen Unterschied im Code ist. Auto-Box bedeutet, dass Sie schreiben können:

myMap.put("foo", 3); 

statt:

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

Auto-Box bedeutet, dass die erste Version implizit in den zweiten umgewandelt wird. Auto-Unboxing bedeutet, dass Sie schreiben können:

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

statt:

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

Der implizite Aufruf intValue() bedeutet, wenn der Schlüssel nicht gefunden, es wird ein NullPointerException, zum Beispiel erzeugen:

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

Der Grund ist type erasure. Anders als etwa in C# werden generische Typen zur Laufzeit nicht beibehalten. Sie sind nur „syntaktischer Zucker“ für die explizite Casting sparen Sie dies zu tun:

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

Um Ihnen ein Beispiel, 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"); 
+3

Ihr letztes Beispiel funktioniert nicht: Kann nicht von Map zu Map T3rm1

+0

Warum funktioniert es nicht mit 'Float' und' Double'? –

+0

Betrachtet man jeden einzelnen Code in einer neuen Zeile, muss der Code in Zeile 5 zuerst in Integer umgewandelt werden, bevor die intValue() -Methode verwendet wird, weil sie als Objekt betrachtet wird, wenn Sie die Methode get() verwenden. –

-2

Sie können Referenztypen in generischen Argumenten verwenden, nicht in primitiven Typen. Also hier sollten Sie

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

und Wert als

myMap.put("abc", 5); 
+1

Dies beantwortet nicht die Frage – smac89

+0

@ Smac89 Ich glaube nicht, dass dies die Frage auch richtig beantwortet, aber es ist eine Antwort.Also, um richtig damit umzugehen, ist das Ablehnen, nicht das Markieren. –

2

verwenden Sie nicht primitiven Typen in HashMap verwenden können. int oder double funktionieren nicht. Sie müssen den umschließenden Typ verwenden. für ein Beispiel

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

Jetzt sind beide Objekte, so wird dies funktionieren.

Verwandte Themen