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:
Object o = "str";
String str = (String)o;
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:
String o = "str";
Integer str = (Integer)o; //Compilation fails here
Zweitens, wenn sie sich in derselben Hierarchie befinden, aber immer noch eine ungültige Besetzung sind, ClassCastException
wird zur Laufzeit a ausgelöst:
Number o = new Integer(5);
Double n = (Double)o; //ClassCastException thrown here
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 von Number
. Wenn Sie also eine Integer
als speichern möchten Number
, 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 haben Double
, 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.)