Konvertieren von Datentypen

Implizite Konvertierung von primitiven Datentypen

Die folgende Tabelle zeigt, welche Datentypen automatisch, also implizit (d. h. ohne "casting") vom Compiler umgewandelt werden. Zu beachten ist, dass byte und short nicht von bzw. in char konvertiert werden.
byte Pfeil nach rechts short Pfeil nach rechts              
        int Pfeil nach rechts long Pfeil nach rechts float Pfeil nach rechts double
    char Pfeil nach rechts              

Bei einer Konvertierung von int oder long nach float oder double kann es zu Genauigkeitsverlusten kommen:
boolean, byte, short, char, int, long, float, double

Explizite Konvertierung (cast) von primitiven Datentypen

Eine explizite Konvertierung (mal von boolean abgesehen) funktioniert immer. Dabei wird in der Regel einfach das Bitmuster (ab der binären 1er Ziffer, also von rechts her) kopiert. Um z. B. einen long in ein byte zu verwandeln (byte b = (byte) myLong;), werden einfach die 8 am wenigsten wichtigen Bits der long-Variablen kopiert. Wird von einem float oder double in ein ganzzahliges Format konvertiert, so wird dabei immer zuerst der Weg über long genommen.

Implizite Konvertierung von Referenztypen

In folgendem Beispiel sind zwei Klassen Oldtype und Newtype im Spiel. Die untenstehende Tabelle bezieht sich auf die zweite Codezeile aus folgendem Code-Fragment:

Oldtype alt = new Oldtype();
Newtype neu = alt; // implizite Konvertierung von Referenzdatentypen
  Oldtype ist eine Klasse Oldtype ist eine Schnittstelle (Interfacde) Oldtype ist ein Array
Newtype ist eine Klasse Oldtype muss eine Subklasse von Newtype sein Newtype muss gleich Object sein Newtype muss gleich Object sein
Newtype ist eine Schnittstelle (Interfacde) Oldtype muss die Schnittstelle Newtype implementieren Oldtype muss eine Unterschnittstelle von Newtype sein Newtype muss eine der Schnittstellen Cloneable bzw. Serializable sein
Newtype ist ein Array Kompilationsfehler Kompilationsfehler Der Felddatentyp von Oldtype muss so beschaffen sein, dass er in den Felddatentyp von Newtype implizit konvertiert wird

Explizite Konvertierung (cast) von Referenzdatentypen

Im Gegensatz zur impliziten Typumwandlung funktioniert die explizite Typkonvertierung (cast) in weitaus mehr Fällen. Zu beachten in der folgenden Tabelle ist jedoch, dass darüber gesagt ist, ob die Konvertierung fehlerfrei durchläuft: So kann das Programm unter Umständen fehlerfrei Kompilieren, aber dennoch eine ClassCastException auslösen.

Auch in diesem Beispiel sind zwei Klassen Oldtype und Newtype im Spiel. Die untenstehende Tabelle bezieht sich auf die zweite Codezeile aus folgendem Code-Fragment:

Oldtype alt = new Oldtype();
Newtype neu = (Newtype) alt; // explizite Konvertierung von Referenzdatentypen
  Oldtype ist eine nicht finale Klasse Oldtype ist eine finale Klasse (final) Oldtype ist eine Schnittstelle (Interface) Oldtype ist ein Array
Newtype ist eine nicht finale Klasse Die beiden Klassen müssen in derselben Vererbungshierarchie stehen Oldtype muss eine Subklasse von Newtype sein Immer ok Newtype muss die Klasse Object sein
Newtype ist eine finale Klasse Newtype muss eine Subklasse von Oldtype sein Beide Referenzen müssen von derselben Klasse sein Newtype muss das Interface Oldtype implementieren Kompilationsfehler
Newtype ist eine Schnittstelle (Interface) Immer ok Oldtype muss die Schnittstelle Newtype implementieren Meist ok Newtype ist eine der Schnittstellen Cloneable oder Serializable
Newtype ist ein Array Oldtype muss die Klasse Object sein Kompilationsfehler Kompilationsfehler Der Felddatentyp von Oldtype muss so beschaffen sein, dass er in den Felddatentyp von Newtype explizit konvertiert werden kann