Casting Unbekannten Typ auf, Wenn Sie Nur einer Bestimmten Klasse, die als Namen einen String der Art
Ich derzeit über eine Liste von Objekten(Mit Hilfe von Java 1.3), und lassen Sie uns sagen, dass ich werfen wollte, eines zurückgegebenen Objekte aus der Liste.get(i) auf eine Art, die ich kennen nur den Namen der Klasse als String. Im wesentlichen, wie kann ich
Object o = (classname)Liste.get(i); wobei className ein String-variable className.
Ich dachte, dass ich verwenden könnte ( der Klasse.forName(className) )Liste.get(i), aber erhielt ich eine syntax-Fehlermeldung, die behauptet, dass ich vergessen, ein Semikolon.
Leider, da ich mich mit Java 1.3, ich habe keinen Zugriff auf die Klasse.cast(Object) Methode.
Was ist der name der Klasse verwendet, bei der Umwandlung in einen anderen Datentyp in Java 1.3? Gibt es irgendeine Methode, die mir den richtigen Typ I müssen mit einem String-parameter der name der Klasse?
- Wenn Sie ein upgrade Ihrer java-version, gehen Sie direkt zu Java 6, da Java 5 wird ein EOL im Oktober. :-]
Du musst angemeldet sein, um einen Kommentar abzugeben.
was ist der Punkt, casting, wenn alles, was Sie tun ist, weisen Sie das Ergebnis in ein Objekt?
Alle, die Sie erzielen würde, ist eine Ausnahme, wenn es nicht die Schnittstelle implementieren/erweitern oder die Klasse oder nichts tun, wenn Sie es Tat.
Für eine einfache:
ausreichend ist (und sauberer)
Wenn du die reflektion verwenden, um auf die Felder/Methoden der Klasse einfach gut
Nicht, und Sie können nicht dies tun, in den meisten Sprachen.
Der Grund ist, dass die Art zu werfen, um zu werden bekannt, die zur Kompilierzeit, nicht zur Laufzeit (was das ist, was Sie zu tun versuchen).
Wenn man darüber nachdenkt, macht es Sinn, weil die gegeben, dass die variable kann jede Art Namen, wie soll man Zugriff auf die verschiedenen Mitglieder? Sie können nicht, nicht, es sei denn, Sie definiert sind, in eine base type/interface, dass alle Instanzen implementieren, in diesem Fall sollten Sie nur diese verwenden.
Einem Szenario, in dem die Notwendigkeit für diese entsteht, ist bei der Durchsetzung geben Sicherheit mit einem legacy-system. Angenommen, Sie haben ein Persistenz-system wie Hibernate bietet eine raw -
List
der Ergebnisse von einer "finder" - Methode. Gießen, rawList
zu einem parametrisierten Typ führt zu einer unchecked-Warnung, und wenn die Liste enthält ein Objekt vom falschen Typ, einClassCastException
ausgelöst werden können, auf unbestimmte Zeit in einigen entfernten verwandten-code. Es kann am besten sein, überprüfen Sie den Inhalt der Liste nach oben vorne, indem Sie einen Mechanismus, wie die OP vorschlägt.Hier ist die Java-version 1.3 (ohne Generika):
In Java 5 und höher, mit Generika, die Sie tun können, etwas ähnliches mit dem
Class.cast()
Methode zu überprüfen, den Inhalt einer Sammlung, die die Verwendung eines SuppressWarnings-annotation. In unserem review-Prozess, ist das unterdrücken einer Warnung ohne "Beweis", dass es sicher ist, eingereicht wurde, als einen bug.Ich davon ausgehen, dass Sie wirklich wollte Folgendes schreiben, anstatt
Object
auf der linken Seite. Da ansonsten, es ist wirklich nur um zu überprüfen, ob das Objekt in der Liste von der richtigen Art ist.Gut, Java ist statisch typisiert. Es ist nicht möglich, dass Sie ihm eine saite, und es gibt Ihnen die entsprechenden statischen Typ, so dass Sie gehen können, ohne casting. Auch mit Generika und
Class<T>.cast
, das cast-Ziel-Typ nicht gegeben ist, durch einen string, sondern durch die generischen Typ-argumentT
ist bekannt, zur compile-Zeit. Sie müssen manuell cast in den richtigen Typ, oder halten die mit den meisten gemeinsamen Typ haben (kann sein Objekt in Ihrem Fall).Wenn Sie
Class.forName(className)
gibt es Sie wieder ein Objekt vom TypClass
enthält Informationen über den Typ zur Laufzeit, so dass es erlaubt Ihnen zu tunAber der cast will einen Typ, nicht ein Objekt des Typs. Das ist, warum der compiler gesagt, es gibt etwas falsch mit diesem code.
Den statischen Typ der Referenz zurückgegeben, ist der
Object
. Das ist wichtig: Der dynamische Typ eines Objekts, auf das verwiesen wird, und dem statischen Typ der Referenz, die Punkte auf das Objekt. Der dynamische Typ des Objekts ist, was werden kann "gesteuert" durch einen string (überClass.forName
), aber die statischen Typ der Referenz, die Sie haben zu tun mit zur compile-Zeit, und das ist (um nur ein Beispiel) wählen Sie die Funktionen, überladen einander, kann nicht bestimmt werden durch eine Zeichenfolge.War die Frage beantwortet schon, aber ich möchte hinzufügen, dass es scheint ein bisschen zweifelhaft, dass Sie sollten eine Liste, in der mehrere verschiedene Arten von Objekten (in diesem Fall alle Objekte), aber Sie würden offensichtlich gern zum aufrufen von Operationen an Ihnen, die spezifisch für jede andere Art...
Was ist der Sinn dieser Sammlung sein? Nicht die Instanzen, die Sie halten in es haben alles gemeinsam - jeder gemeinsamen obertyp, den Sie konnten, warfen Sie in?