|
Bei einer Konvertierung von int oder
long nach float oder
double kann es zu Genauigkeitsverlusten kommen:
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.
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 |
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 |