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",newInteger(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:
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.
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:
publicinterfaceMap<K extendsObject, V extendsObject>
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 =newHashMap<>();
oder
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];
Antworten:
Sie können in Java keine primitiven Typen als generische Argumente verwenden. Verwenden Sie stattdessen:
Beim Auto-Boxing / Unboxing gibt es kaum Unterschiede im Code. Auto-Boxing bedeutet, dass Sie schreiben können:
anstatt:
Auto-Boxing bedeutet, dass die erste Version implizit in die zweite konvertiert wird. Auto-Unboxing bedeutet, dass Sie schreiben können:
anstatt:
Der implizite Aufruf von
intValue()
bedeutet, dass der Schlüssel, wenn er nicht gefunden wird, Folgendes generiertNullPointerException
: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:
Um Ihnen ein Beispiel zu geben, dieser Code ist vollkommen legal:
quelle
GNU Trove unterstützt dies, verwendet jedoch keine Generika. http://trove4j.sourceforge.net/javadocs/gnu/trove/TObjectIntHashMap.html
quelle
Sie können in keine primitiven Typen verwenden
HashMap
.int
oderdouble
nicht arbeiten. Sie müssen den umschließenden Typ verwenden. zum BeispielJetzt sind beide Objekte, also wird dies funktionieren.
quelle
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:
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:
oder
quelle
Sie können den Referenztyp in generischen Argumenten verwenden, nicht den primitiven Typ. Also hier solltest du verwenden
und Wert speichern als
quelle