Was Typumwandlung bedeutet
Java ist statisch typisiert: Jeder Wert hat einen Typ, und der Compiler lässt dich inkompatible Typen nicht stillschweigend vermischen. Die Typumwandlung ist die Art und Weise, wie du einen Wert von einem Typ in einen anderen konvertierst — manchmal macht Java es für dich, und manchmal musst du es explizit verlangen.
Es gibt zwei Richtungen. Von einem kleineren Typ zu einem größeren zu wechseln (ein int in ein double) ist sicher und geschieht automatisch. Von einem größeren Typ zu einem kleineren zu wechseln (ein double in ein int) kann Daten verlieren, daher zwingt dich Java, es mit einem Cast auszuschreiben.
Erweiterung: die automatische Konvertierung
Eine erweiternde Konvertierung verschiebt einen Wert in einen Typ mit mehr Platz. Es kann nichts verloren gehen, daher macht Java es für dich ohne Cast:
Die int-7 passt in ein double und wird zu 7.0. Die Erweiterungsreihenfolge für Zahlen ist byte -> short -> int -> long -> float -> double; eine Zuweisung von links nach rechts entlang dieser Kette benötigt nie einen Cast. Deshalb „funktioniert" das Mischen von Typen in der Arithmetik oft einfach — Java erweitert zuerst den kleineren Operanden.
Einschränkung: der explizite Cast
In die andere Richtung — eine einschränkende Konvertierung — können Daten verloren gehen, daher verweigert der Compiler dies, es sei denn, du setzt den Zieltyp in Klammern vor den Wert:
(int) pi ist der Cast. Achte darauf, was er macht: Er schneidet in Richtung Null ab und verwirft einfach den Nachkommateil. 3.9 wird zu 3, und -3.9 wird zu -3. Er rundet nicht. Wenn du runden möchtest, ist das ein anderes Werkzeug:
Zu vergessen, dass ein Cast abschneidet, ist einer der häufigsten Anfängerfehler — wenn deine „gerundete" Zahl immer um eins zu niedrig ist, liegt es meist daran.
Die Falle der Ganzzahldivision
In diese Falle tappt jeder einmal. Wenn beide Operanden int sind, führt der Operator / eine Ganzzahldivision durch und verwirft den Rest — bevor überhaupt eine Zuweisung an ein double erfolgt:
a / b ist 7 / 2, vollständig in int-Arithmetik berechnet, was 3 ergibt. Die anschließende Erweiterung zu double macht aus 3 nur 3.0 — die .5 ist bereits weg. Wenn man zuerst einen Operanden zu double castet ((double) a / b), zwingt das den gesamten Ausdruck in Gleitkomma und liefert das gewünschte 3.5. Du musst nur eine Seite casten; Java erweitert die andere passend dazu.
Wenn die Einschränkung überläuft
Ein Cast prüft nicht, ob der Wert hineinpasst. Wenn nicht, werden die Bits einfach abgeschnitten und du bekommst ein überraschendes Ergebnis — kein Fehler, keine Warnung:
300 passt nicht in ein byte, daher werden die höherwertigen Bits verworfen und du erhältst 44. Das ist „stiller" Datenverlust — das Programm läuft einwandfrei und liefert ein falsches Ergebnis. Schränke nur ein, wenn du sicher bist, dass der Wert in den kleineren Typ passt.
Konvertieren zwischen Zahlen und Strings
Ein String ist ein Objekt, keine Zahl, daher kannst du ihn nicht mit (int) casten — das ist ein Kompilierungsfehler. Für die Konvertierung gibt es stattdessen eigene Methoden:
Von Text zu einer Zahl verwendet man Integer.parseInt / Double.parseDouble. Ist der String keine gültige Zahl (etwa "hello"), werfen diese Methoden eine NumberFormatException. Von einer Zahl zu Text verwendest du String.valueOf(n) oder verkettest einfach mit "" — denn n + "" zwingt das int in einen String. Achte auf den Unterschied zwischen "5" + 1 (was den String "51" ergibt) und 5 + 1 (was 6 ergibt); das + bedeutet Verkettung, sobald ein String beteiligt ist.
Objekte casten
Casting gilt auch für Objektreferenzen, nicht nur für primitive Typen. Du kannst eine Referenz entlang einer Vererbungskette in einen verwandten Typ casten — die Erweiterung zu einem übergeordneten Typ ist automatisch, das Einschränken zurück nach unten benötigt einen expliziten Cast und ist nur sicher, wenn das Objekt wirklich von diesem Typ ist:
Object o = "hello";
String s = (String) o; // OK: o verweist tatsächlich auf einen String
Integer bad = (Integer) o; // kompiliert, wirft aber zur Laufzeit eine ClassCastException
Der zweite Cast kompiliert, fliegt aber zur Laufzeit mit einer ClassCastException auf, weil das Objekt ein String ist, kein Integer. Das wirst du richtig kennenlernen, sobald du zu Vererbung und Polymorphie kommst; für den Moment reicht es zu wissen, dass die (Type)-Syntax dieselbe Idee ist, angewendet auf Objekte.
Als Nächstes: if-else
Casting erlaubt dir, Werte umzuformen; der nächste Schritt ist, dein Programm anhand dieser Werte zwischen Pfaden wählen zu lassen. Die if-else-Anweisung führt einen Block aus, wenn eine Bedingung wahr ist, und einen anderen, wenn sie falsch ist — die Grundlage jeder Entscheidung, die dein Code trifft. Das ist die nächste Seite.
Häufig gestellte Fragen
Was ist Typumwandlung in Java?
Typumwandlung bedeutet, einen Wert von einem Datentyp in einen anderen zu konvertieren. Java führt kleine „erweiternde" Konvertierungen automatisch aus (etwa von int zu double), aber eine „einschränkende" Konvertierung, bei der Daten verloren gehen könnten (etwa von double zu int), erfordert einen expliziten Cast: int n = (int) 3.9;.
Wie wandelt man in Java ein double in ein int um?
Schreibe den Zieltyp in Klammern vor den Wert: int n = (int) 3.9;. Das schneidet in Richtung Null ab (verwirft den Nachkommateil), du erhältst also 3, nicht 4. Um stattdessen zu runden, verwende Math.round(3.9), was 4 zurückgibt.
Wie wandelt man in Java einen String in ein int um?
Ein String ist keine Zahl, daher kannst du ihn nicht mit (int) casten. Verwende Integer.parseInt("42"), um ein int zu erhalten, oder Double.parseDouble("3.14") für ein double. Ist der Text keine gültige Zahl, werfen diese Methoden eine NumberFormatException.