Mit int als Typ-Parameter für java.util.Dictionary
-
18-09-2019 - |
Frage
Wenn ich ein Wörterbuch als solche deklarieren:
private Dictionary<String, int> map;
Der Compiler gibt mir die folgende Fehlermeldung:
Syntaxfehler auf Token "int", Abmessungen nach diesem Token erwartet
Aber es funktioniert mit Integer
in Ordnung. Ich bin vage bewusst, dass Java behandelt int
/ Integer
anders (ich von einem .NET-Hintergrund kommen), aber ich habe gehofft, dass mir jemand eine vollständige Erklärung geben könnte, warum ich nicht Primitiven in einem Wörterbuch verwenden kann <>
Lösung
In Java Primitive sind keine Objekte, so dass Sie sie nicht anstelle von Objekten verwendet werden. Allerdings wird Java automatisch Box / unbox Primitiven (aka Autoboxing ) in Objekte, so dass Sie tun können, Dinge wie:
List<Integer> intList = new LinkedList<Integer>();
intList.add(1);
intList.add(new Integer(2));
...
Integer first = intList.get(0);
int second = intList.get(1);
Aber das ist wirklich nur die Compiler automatisch Typen für Sie konvertieren.
Andere Tipps
In .Net, "primitive" Typen werden durch Objekte gesichert. In Java gibt es eine harte Unterscheidung zwischen primitiven Typen und Objekten. Java 5 eingeführt Autoboxing, die zwischen den beiden in bestimmten Situationen zwingen kann. Da jedoch der Java Generics Systemtyp Löschen verwendet, gibt es nicht genügend Informationen, um autobox in diesem Fall.
Java Sammlungen nur Verweise nicht Primitiven ermöglichen. Sie müssen die Wrapper-Klassen (in diesem Fall java.lang.Integer) verwenden, um zu tun, was Sie nach:
private Dictionary<String, Integer> map;
Sie können Dinge wie:
int foo = map.get("hello");
und
map.put("world", 42);
und Java verwendet Autoboxing / Unboxing mit den Einzelheiten der Konvertierung für Sie zu behandeln.
Hier ist eine kleine Beschreibung auf sie.
Um auf TofuBeer Antwort zu erweitern.
int ist eine primitive
Integer ist ein Objekt.
Generics unterstützt keine Primitiven.
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
Das ist der Trick Typ angeben, um es mit Primitiven funktioniert
In Ihrem Adapter
das gleiche mit im Paket-info bedeutet, dass Sie es tun global für das Paket
Sie haben diese nach experimentieren.
public class MyAdapter extends XmlAdapter<String, Integer> {
Da in Java die Primitiven truely Primitive sind. In Java int
wird nach Wert übergeben, während Integer
einen Verweis übergeben wird. In .NET int oder Int32 usw. sind nur unterschiedliche Namen.