Type Casting
Kurz: Die explizite oder implizite Umwandlung eines Werts von einem Datentyp in einen anderen — z. B. eine Ganzzahl in eine Gleitkommazahl oder umgekehrt.
Genauer: Bei impliziten (“widening”) Umwandlungen kümmert sich die Sprache automatisch darum, etwa wenn ein int verlustfrei in ein double passt. Explizites (“narrowing”) Casting muss der Programmierer selbst anfordern, weil dabei Information verloren gehen kann — etwa wenn eine Gleitkommazahl in eine Ganzzahl umgewandelt wird und die Nachkommastellen wegfallen. Falsches Casting ist eine häufige Fehlerquelle, besonders bei der Umwandlung zwischen sehr unterschiedlichen Wertebereichen.
Im Detail
int ganzzahl = 10;
double gleitkomma = ganzzahl; // implizit (widening) - int passt verlustfrei in double
double preis = 19.99;
int abgerundet = (int) preis; // explizit (narrowing) - muss angefordert werden
System.out.println(abgerundet); // 19 - die Nachkommastellen sind einfach WEG, nicht gerundet!Ein wichtiges Detail bei “narrowing”-Casts von Gleitkomma- zu Ganzzahltypen: Es wird nicht mathematisch gerundet, sondern schlicht abgeschnitten (Richtung Null) — (int) 19.99 ergibt 19, nicht 20. Wer echtes Runden braucht, muss explizit eine Rundungsfunktion (z. B. Math.round()) verwenden, statt sich auf das Casting selbst zu verlassen.
Neben der Umwandlung zwischen numerischen Typen gibt es Casting auch bei Objekten innerhalb einer Vererbungs-Hierarchie:
Tier t = new Hund(); // implizit: Hund "ist ein" Tier
Hund h = (Hund) t; // explizit: "downcasting" zurück zum spezifischeren TypEin Objekt einer Unterklasse kann implizit als sein Oberklassen-Typ behandelt werden (jeder Hund ist auch ein Tier) — das ist gefahrlos, weil ein Hund alles kann, was ein Tier kann. Der umgekehrte Weg (ein Tier explizit zu einem Hund casten) ist dagegen riskant: Ist das Objekt zur Laufzeit tatsächlich gar kein Hund, sondern z. B. eine Katze, wirft dieser Cast einen Laufzeitfehler. Viele Sprachen bieten deshalb eine sichere Prüf-Variante (z. B. instanceof in Java), um vor dem Casting zu testen, ob es überhaupt zulässig wäre.
Siehe auch: byte, double, Non-primitive Types