In Java ist es möglich, erstellen Sie eine Typ-sichere Anzeigen von Klassen, um Instanzen Ihrer Klasse?
Ich würde gerne eine Karte erstellen, die verwendet eine Klasse als Schlüssel, um eine Instanz der Klasse. So etwas wie:
<T> Map< Class<T>, T > instanceMap = new HashMap< Class<T>, T > ();
instanceMap.put( Boolean.class, Boolean.TRUE );
instanceMap.put( String.class, "asdf" );
instanceMap.put( Integer.class, 11 );
Boolean b = instanceMap.get( Boolean.class );
Integer i = instanceMap.get( Integer.class );
String s = instanceMap.get( String.class );
Ist das möglich? Ich habe das Gefühl, dass, Nein, es ist nicht, weil ich nicht darauf hinweisen, dass T
gemeint ist ein generischer Typ, anstatt eine Klasse mit dem Namen "T". Es fühlt sich irgendwie wie "higher-order-Generika".
EDIT: ich weiß, ich könnte versuchen, erweitern die Karte und die Umsetzung eigener wrapper etc, aber ich bin speziell Fragen über das tun dies nur mit der Verwendung von Java ist die generelle Unterstützung. Ich bin mehr daran interessiert, die Idee, anstatt diesem speziellen Fall.
EDIT 2: Wie bereits unten beschrieben, ist dies eine doppelte (oder mehr speziell ein subcase) Frage: Java-Karte mit Werten begrenzt durch key-type-parameter . Hatte ich in der Lage zu finden Formulierungen, wie eloquent wie hätte ich wahrscheinlich gefunden, dass Antwort und nicht gepostet.
- Könnten Sie speichern nur einen Wert pro Klasse (key)?
- Ja, dies würde verwendet werden, ein Zugriff auf DAOs, wo Sie wollen nur eine dao-pro dao-Typ.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie ich dich verstehe, sagst du, dass Sie nach der Erstellung dieser Karte, die Sie möchten, füllen Sie es mit etwas wie ...
etc. Richtig?
In diesem Fall, denke ich, die Antwort ist Nein, Sie können nicht tun, dass mit Generika. Generika sagen, dass für eine gegebene Instanz der Klasse -- die Karte in diesem Fall-Sie sind unter Angabe der Art, die anwendbar sind. Also, wenn Sie sagen
new HashMap<String,Integer>;
Sie sagen, dass alle Operationen, die sich gegen diese Karte wird mit einem Schlüssel ein string und ein Wert ist eine ganze Zahl. Aber das ist nicht, was Sie tun möchten, in diesem Fall. Sie wollen in der Lage sein, jede Art von Objekt in der Klasse, und dann begrenzen Sie die akzeptierten Typen für den Schlüssel auf der Grundlage des Typs des Objekts. Das ist nicht, wie die generics arbeiten. Sie sind nicht um eine Beziehung zwischen einander, Sie sind eine Konstante für eine gegebene Instanz.Könnte man, natürlich, erstellen Sie eine solche Karte als
new HashMap<Class,Object>;
. Dies würde nicht zwingen, die Klasse zu der Klasse des entsprechenden Objekts, aber es würde Ihnen erlauben, geben Sie diese Werte ein.Außer, dass ich denke, Sie bräuchte einen wrapper. Sollte ich darauf hinweisen, dass der wrapper setzen würde nur noch einen parameter, wie könnte es vermutlich bestimmen die Klasse der parameter, indem Sie
getClass()
drauf wäre, gäbe es keine Notwendigkeit, Sie zu erzählen?Meinst du so etwas ?
siehe als Referenz: Java-Karte mit Werten begrenzt durch key-type-parameter
In deinem Beispiel
T
hätte anders sein für jedes Schlüssel/Wert, in der Erwägung, dass mit GenerikaT
müssen die gleichen für jedes Schlüssel/Wert. Also Nein, dies ist nicht möglich, die Verwendung von Generika. (aber natürlich die Umsetzung ist sicherlich möglich mit dem Gießen und/oder nicht die Verwendung von Generika)with generics, T must be the same for each key/value
klingt wie eine Einschränkung, geerbt von C++ eher als eine Einschränkung, dass Java generics Bedürfnisse zu haben; denn in meinem Beispiel ist es immer noch statisch überprüfbar.Den Punkt
Map<T, U>
ist die Karte T zu U ist. T und U kann jede Klasse sein (vorausgesetzt, es ist kein Platzhalter), aber wenn Sie entschlossen sind, Sie nicht ändern können. In Ihrem Fall, Sie möchten ein mapping, dass wieder eine andere Klasse, je nachdem, welchen Schlüssel man verwendet, das ist offensichtlich anders.Den üblichen Weg zu gehen dies ist nur U
Object
, da können Sie voran gehen und werfe es alles was Sie brauchen. Aber natürlich bricht die Typ-Sicherheit, die Generika werden soll, zur Verfügung zu stellen.Kurz gesagt, ich glaube nicht, dass dies möglich sein würde, ohne zu schreiben eine wrapper in irgendeiner Form.
T
muss auf einige spezifische Art, wenn eine Instanz erstellt wird, so dass Sie wäre nicht in der Lage, zum hinzufügen von verschiedenen Arten, um die Karte über dieput
Methode. Generische Methoden, auf der anderen Seite, haben Ihre Art Argumente gesetzt, wenn Sie aufgerufen werden, so dass Sie tun, was Sie wollen.Guave hat eine ClassToInstanceMap - Typ, der verwendet generische Methoden zu sicher zu handhaben putting-Instanzen in der Karte und bekommen Sie heraus.
JsonObject könnte eine option sein.
Sie können setzen, was Sie wie als der Wert des jsonobject. Was Sie brauchen, ist das Paket org.json.JSONObject. Allerdings, Sie möglicherweise nicht in der Lage sein zu verwenden foreach mit JSONObject, aber einige alternative Methoden gibt es, Iterieren über ein JSONObject?
Map<String,Object>
.