Ich frage mich, ob mir jemand sagen könnte, wie Casting funktioniert. Ich verstehe, wann ich es tun sollte, aber nicht wirklich, wie es funktioniert. Bei primitiven Datentypen verstehe ich teilweise, aber wenn es um das Casting von Objekten geht, verstehe ich nicht, wie es funktioniert.
Wie kann ein Objekt vom Typ Objekt plötzlich in MyType
beispielsweise (nur ein Beispiel) umgewandelt werden und dann alle Methoden abrufen?
Antworten:
Das Casting in Java ist keine Zauberei. Sie teilen dem Compiler mit, dass ein Objekt vom Typ A tatsächlich vom spezifischeren Typ B ist, und erhalten so Zugriff auf alle Methoden auf B, die Sie sonst nicht gehabt hätten. Sie führen beim Casting keine Art von Magie oder Konvertierung durch, sondern sagen dem Compiler im Wesentlichen: "Vertrauen Sie mir, ich weiß, was ich tue, und ich kann Ihnen garantieren, dass dieses Objekt in dieser Zeile tatsächlich ein <Insert-Cast ist." tippe hier>. " Beispielsweise:
Das obige ist in Ordnung, nicht magisch und alles gut. Das in o gespeicherte Objekt ist eigentlich eine Zeichenfolge, und daher können wir problemlos in eine Zeichenfolge umwandeln.
Es gibt zwei Möglichkeiten, wie dies schief gehen könnte. Erstens, wenn Sie zwischen zwei Typen in völlig unterschiedlichen Vererbungshierarchien wechseln, erkennt der Compiler, dass Sie dumm sind, und hält Sie auf:
Zweitens, wenn sie sich in derselben Hierarchie befinden, aber immer noch eine ungültige Besetzung sind,
ClassCastException
wird zur Laufzeit a ausgelöst:Dies bedeutet im Wesentlichen, dass Sie das Vertrauen des Compilers verletzt haben. Sie haben gesagt, Sie können garantieren, dass das Objekt von einem bestimmten Typ ist, und das ist es nicht.
Warum brauchst du Casting? Zunächst einmal brauchen Sie es nur, wenn Sie von einem allgemeineren Typ zu einem spezifischeren Typ wechseln. Zum Beispiel
Integer
erbt vonNumber
. Wenn Sie also eineInteger
als speichern möchtenNumber
, ist dies in Ordnung (da alle Ganzzahlen Zahlen sind). Wenn Sie jedoch umgekehrt vorgehen möchten, benötigen Sie eine Umwandlung - nicht alle Zahlen sind Ganzzahlen (auch) als Integer wir habenDouble
,Float
,Byte
,Long
, etc.) und selbst wenn es in Ihrem Projekt oder das JDK nur eine Unterklasse ist, könnte jemand eine andere leicht zu erstellen und verteilen, so dass Sie auch keine Garantie haben , wenn Sie denken , dass es eine einzige offensichtliche Wahl !In Bezug auf die Verwendung für das Casting sehen Sie in einigen Bibliotheken immer noch die Notwendigkeit dafür. Vor Java-5 wurde es häufig in Sammlungen und verschiedenen anderen Klassen verwendet, da alle Sammlungen daran arbeiteten, Objekte hinzuzufügen und dann das Ergebnis zu übertragen, dass Sie die Sammlung wieder verlassen haben. Mit dem Aufkommen von Generika ist jedoch ein Großteil der Verwendung für das Casting weggefallen - es wurde durch Generika ersetzt, die eine viel sicherere Alternative darstellen, ohne das Potenzial für ClassCastExceptions (in der Tat, wenn Sie Generika sauber verwenden und es ohne Warnungen kompiliert wird). Sie haben die Garantie, dass Sie niemals eine ClassCastException erhalten.)
quelle
Double.valueOf(gpsLastLoc.getLatitude()).getClass().getSimpleName()
. In beiden Fällen sollten Sie die Klasse eines Grundelements niemals dynamisch abrufen müssen, dagetLatitude()
Sie immer wissen, dass einDouble
Objekt , wenn es ein Doppelprimitiv zurückgibt, zu einem Objekt heraufgestuft wird.Casting funktioniert eigentlich nicht immer. Wenn das Objekt nicht
instanceof
die Klasse ist, in die Sie es umwandeln, erhalten Sie zurClassCastException
Laufzeit eine.quelle
Angenommen, Sie wollten a
String
in aFile
umwandeln (ja, das ergibt keinen Sinn), Sie können es nicht direkt umwandeln, da dieFile
Klasse kein Kind und kein Elternteil derString
Klasse ist (und der Compiler sich beschwert).Aber Sie könnten Ihre
String
zu werfenObject
, weil aString
einObject
(Object
ist Elternteil). Dann könnten Sie dieses Objekt inFile
a umwandeln, da eine Datei eine istObject
.Alle Ihre Vorgänge sind also zum Zeitpunkt der Kompilierung unter dem Gesichtspunkt der Eingabe "legal", aber dies bedeutet nicht, dass sie zur Laufzeit funktionieren!
Der Compiler lässt dies zu, auch wenn es keinen Sinn ergibt, stürzt jedoch zur Laufzeit ab, mit der folgenden Ausnahme:
quelle
Das Casting einer Referenz funktioniert nur, wenn es sich um einen
instanceof
solchen Typ handelt. Sie können keine zufälligen Referenzen erstellen. Außerdem müssen Sie mehr darüber lesenCasting Objects
.z.B
quelle
Der richtige Weg ist folgender:
Die Methode
cast()
ist eine viel sicherere Alternative zum Casting zur Kompilierungszeit.quelle