4.11.4 | Cast-Konstrukte mit Verweistypen |
Cast-Konstrukte werden vorwiegend benötigt, wenn folgende Umstände zusammentreffen:In diesem Fall kann der Verweis mit einem Cast in die Unterklasse verwandelt werden. Nach der Umwandlung kann dann die Methode aufgerufen werden. Im folgenden Beispiel wird ein Verweis auf Point in den Typ Square umgewandelt, um die Methode area() aufzurufen, die nur in Square, nicht aber in Point verfügbar ist:
- Es liegt eine Variable mit Verweistyp auf die Klasse A vor.
- An diese Variable wird ein Exemplar einer Unterklasse B von A zugewiesen.
- Mit dem Verweis soll eine Methode aufgerufen werden, die in B, aber nicht in A vorkommt.
Point p; // Zuweisung eines Exemplars von Square an p; int a = ((Square)p).area();Hierbei ist zu beachten, dass zweimal geklammert werden muss. Einmal wird der Name der Klasse, in die umgewandelt wird, in Klammern eingefasst. Diese Klammerung wird dann noch einmal zusammen mit der Variable geklammert.
Eine weiterer Anwendungsfall für ein Cast-Kontrukt liegt vor, wenn ein Verweis auf die Klasse A an einen Verweis auf die Unterklasse B zugewiesen werden soll:Point p; Square s; // Zuweisung eines Exemplars p von Square an s; s = (Square)p;Die letzte Beispiel wirft natürlich die Frage auf, was geschieht, wenn p zur Laufzeit eben nicht auf ein Exemplar von Square oder eine Unterklasse von Square verweist, sondern auf ein Exemplar von Point. Um die Problematik ungültiger Typumwandlungen zu lösen, geht Java in zwei Stufen vor:Der kritischste Fall ist der letzte, nämlich die Auslösung einer Exception. Aber auch gegen diesen Fall kann man sich absichern. Hierzu stellt Java den Operator instanceof zur Verfügung.
- Zunächst prüft der Compiler, ob er bereits eindeutig feststellen kann, dass eine Konvertierung zulässig ist. Falls der Compiler diese Entscheidung treffen kann, ist die Typumwandlung entweder in Ordnung, oder er meldet einen Fehler.
- Falls beim Kompilieren nicht eindeutig festgestellt werden kann, ob eine Typumwandlung zulässig ist, baut der Compiler eine Laufzeitüberprüfung in den Bytecode ein. Hierdurch wird zur Laufzeit geprüft, ob die Umwandlung zulässig ist. Ist sie unzulässig, wird eine ClassCastException ausgelöst.