Typkonvertierungen primitiver Datentypen
How To ...
Welche Konvertierungen der primitiven Datentypen sind möglich? Werden diese automatisch vorgenommen oder müssen sie explizit programmiert werden?
Hintergründe
Java erlaubt einerseits die Konvertierung von bestimmten primitiven Datentypen in andere primitive Datentypen, verbietet diese aber andererseits für einige Typkombinationen. Als Grundregel gilt, dass der Typ boolean in keinen anderen Typ gewandelt werden kann und kein anderer Typ in boolean gewandelt werden kann.
Die ganzzahligen Typen und die Gleitkommazahlen (siehe Zahlenbereiche) können ineinander konvertiert werden. Da char-Werte Zahlen in der Unicode-Codierung darstellen, kann auch der Typ char in bzw. aus Zahlen konvertiert werden.
Bei der Konvertierung wird zwischen der Konvertierung eines „kleineren” in einen „größeren” Typ und umgekehrt unterschieden. Im Englischen spricht man von einer Widening Conversion und einer Narrowing Conversion. Ein größerer Typ ist dabei ein Typ, der den darstellbaren Bereich des kleineren Typs umfasst. Eine erweiternde Konvertierung wird vom Compiler automatisch vorgenommen, eine einschränkende Konvertierung muss durch einen Cast erzwungen werden.
So geht's
Erweiternde Konvertierungen werden automatisch vom Compiler vorgenommen:
byte b = -3; short s = b; int i = s; long l = i; // l ist -3
Einschränkende Konvertierungen werden durch ein Cast erzwungen:
int i = (int) 3.1415;
Da chars wie Zahlen verwendet werden können, aber im Gegensatz zu den „richtigen” Zahlen kein Vorzeichen hat, ist bei Konvertierungen zwischen Zahlen und chars besondere Vorsicht geboten:
short s = (short) 0xffff; // hex für -1 char c = '\uffff'; // auch Bitmuster für -1 aber Unicode int i = s; // Erweiternde Konvertierung zu -1 int k = c; // Erweiternde Konvertierung zu 65535
Die folgende Tabelle gibt für alle Kombinationsmöglichkeiten der primitiven Datentypen die Konvertierungsmöglichkeiten und Konvertierungsdurchführung an. Dabei bedeutet der durchgestrichene Existenzquantor (∄), dass diese Konvertierung nicht existiert. Der Pfeil nach oben bedeutet eine erweiternde Konvertierung, die automatisch statt findet. Der Pfeil nach unten bedeutet eine einschränkende Konvertierung, die explizit durch ein Cast erzwungen werden muss. Bei der Konvertierung von int und long nach float und double können Informationsverluste auftreten, da der Zahlenbereich für die Gleitkommatypen zwar größer ist als der der ganzen Zahlen, aber Lücken aufweist.
| Nach | ||||||||
|---|---|---|---|---|---|---|---|---|
| von | boolean | byte | short | char | int | long | float | double |
| boolean | ― | ∄ | ∄ | ∄ | ∄ | ∄ | ∄ | ∄ |
| byte | ∄ | ― | ↗ | ↘ | ↗ | ↗ | ↗ | ↗ |
| short | ∄ | ↘ | ― | ↘ | ↗ | ↗ | ↗ | ↗ |
| char | ∄ | ↘ | ↘ | ― | ↗ | ↗ | ↗ | ↗ |
| int | ∄ | ↘ | ↘ | ↘ | ― | ↗ | ↗ | ↗ |
| long | ∄ | ↘ | ↘ | ↘ | ↘ | ― | ↗ | ↗ |
| float | ∄ | ↘ | ↘ | ↘ | ↘ | ↘ | ― | ↗ |
| double | ∄ | ↘ | ↘ | ↘ | ↘ | ↘ | ↘ | ― |
