EMZETT.
Login

Type Casting

Kurz: Die explizite (oder implizite) Umwandlung eines Werts von einem Datentyp in einen anderen — z. B. von int zu double oder umgekehrt.

Genauer: “Widening” (z. B. int → double) passiert automatisch, da dabei keine Information verloren geht. “Narrowing” (z. B. double → int) muss explizit erzwungen werden, da dabei Präzision verloren gehen kann: int i = (int) 3.9; ergibt 3, der Nachkommaanteil wird abgeschnitten, nicht gerundet.

Im Detail

// Widening (automatisch, kein Datenverlust):
int i = 100;
double d = i; // int -> double, funktioniert ohne explizites Casting
 
// Narrowing (muss explizit erzwungen werden):
double preis = 19.99;
int gerundetNachUnten = (int) preis; // 19 - Nachkommastellen werden abgeschnitten, NICHT gerundet
 
// Bei Objekten: Downcasting einer Oberklassen-Referenz zurück zur Unterklasse
Object obj = "Hallo"; // Upcasting passiert automatisch
String s = (String) obj; // Downcasting muss explizit sein und kann fehlschlagen
 
if (obj instanceof String) { // Sicherheitscheck VOR dem Casting
    String sicher = (String) obj;
}

Bei primitiven Typen unterscheidet Java zwischen “Widening” (ein kleinerer Typ wird automatisch in einen größeren umgewandelt, z. B. int → long → double, da dabei garantiert keine Information verloren geht) und “Narrowing” (ein größerer Typ soll in einen kleineren passen, z. B. double → int), das immer explizit mit (zielTyp) erzwungen werden muss, weil dabei Präzision oder ganze Werte verloren gehen können. Wichtig: (int) 19.99 RUNDET nicht auf 20, sondern schneidet die Nachkommastellen einfach ab (19) — für echtes Runden braucht es Math.round(...).

Bei Objekten (Referenztypen) funktioniert Casting nach demselben Grundprinzip: “Upcasting” (eine Unterklasse einer Oberklassen-Variable zuweisen, z. B. Object obj = "text") passiert automatisch und ist immer sicher. “Downcasting” (eine allgemeinere Referenz zurück in einen spezifischeren Typ casten) muss explizit sein und kann zur Laufzeit mit einer ClassCastException fehlschlagen, wenn das Objekt tatsächlich gar nicht vom gecasteten Zieltyp ist — deshalb sollte vor einem Downcast idealerweise mit instanceof geprüft werden, ob das Objekt wirklich den gewünschten Typ hat.

Siehe auch: double, byte, Non-primitive Types