„Und nun zum interessantesten Teil. Ich erzähle dir von Typumwandlungen. Variablen können ihren Typ nicht ändern, aber es gibt einen Ort, an dem du Typen umwandeln kannst. Dieser Ort ist die Zuweisungsoperation.

„Du kannst Variablen verschiedener Typen einander zuweisen. Dabei wird der Wert einer Variablen (eines bestimmten Typs) in einen Wert des anderen Typs umgewandelt und der anderen Variablen zugewiesen.

„Wir können zwei Arten von Umwandlungen unterscheiden: erweiternde Umwandlungen von primitiven Datentypen und einschränkende Umwandlungen von primitiven Datentypen. Erweitern kannst du dir so vorstellen, dass du Dinge aus einem kleinen Korb in einen großen Korb legst. Das Vorgehen ist unauffällig und schmerzlos. Einschränken kannst du dir so vorstellen, dass du Dinge aus einem großen Korb nimmst und sie in einen kleineren Korb legst. Dabei stellst du vielleicht fest, dass du nicht genug Platz hast; dann musst du ein paar Dinge weglassen.

„Hier sind die Typen nach ihrer ‚Korbgröße‘ sortiert:“

Typumwandlung - 1

„Nur ein paar Anmerkungen:

1. der char-Korb ist genauso groß wie der short-Korb, aber du kannst die Dinge nicht einfach von einem zum anderen verschieben. Wenn du Werte von short nach char verschiebst, gehen Werte, die kleiner als 0 sind, immer verloren. Wenn du Werte von char nach short verschiebst, gehen Werte über 32.000 verloren.

2. Wenn du ganze Zahlen in Dezimalzahlen umwandelst, könnten die kleinsten signifikanten Stellen der Zahl verworfen werden. Das ist jedoch kein Problem, da der Zweck einer Dezimalzahl darin besteht, einen Näherungswert zu speichern.“

„Wenn wir einschränkende Umwandlungen durchführen, müssen wir dem Compiler explizit mitteilen, dass wir keinen Fehler gemacht haben: Wir verwerfen einen Teil der Zahl absichtlich. Wir verwenden dazu einen cast-Operator (d.h. den Typnamen in Klammern).“

„So musst du Variablen verschiedener Typen zuweisen:“

Java-Code Beschreibung
byte a = 115;
int b = a;
Erweiternde Umwandlung eines primitiven Datentyps. Alles ist bestens.
int c = 10000;
byte d = (byte) c;
Einschränkende Umwandlung eines primitiven Datentyps. Wir müssen explizit angeben, dass die zusätzlichen Bytes verworfen werden sollen.
int c = 10;
byte d = (byte) c;
Einschränkende Umwandlung eines primitiven Datentyps. Wir müssen explizit angeben, dass die zusätzlichen Bytes verworfen werden sollen. auch wenn sie gleich 0 sind.
float f = 10000;
long l = (long) (f * f);
float f2 = l;
long l2 = (long) f2;
Bei der Zuweisung zu einem float findet eine erweiternde Umwandlung eines primitiven Datentyps statt. Bei der Zuweisung von einem float zu einem long findet eine einschränkende Umwandlung eines primitiven Datentyps statt. Es ist ein cast-Operator erforderlich.
double d = 1;
float f = (float) d;
long l = (long) f;
int i = (int) l;
short s = (short) i;
byte b = (byte) s;
Einschränkende Umwandlungen in allen Zuweisungsvorgängen mit Ausnahme der ersten Zeile. Diese Umwandlungen setzen voraus, dass wir die Typumwandlung explizit angeben.

„Ein cast-Operator muss immer dann vor eine Zahl/Variable gesetzt werden, wenn ein Teil der Zahl verworfen wird oder wenn eine einschränkende Umwandlung eines primitiven Datentyps stattfindet. Der cast-Operator beeinflusst nur die Zahl/Variable, die direkt darauf folgt.“

Java-Code Beschreibung
float f = 10000;
long l = (long) f * f;
Nur eine der beiden Variablen wird zu einem long-Wert umgewandelt: die Multiplikation einer long-Variable mit einer float-Variable ergibt eine float-Variable.
float f = 10000;
long l = (long) (f * f);
Der gesamte Ausdruck wird zu einem long-Wert umgewandelt.

„Ach so.“