Next: Operatoren
Up: GrundsymboleOperatoren und Ausdrücke
Previous: Auswertungsreihenfolge
Typanpassung tritt auf bei Wertzuweisungen, Ausdrücken und Parameterübergaben.
Wir unterscheiden:
- implizite Typanpassung
- explizite Typanpassung
Hier unterscheiden wir die Typanpassung für
Grundtypen und die für Referenztypen.
Bei Grundtypen wird implizit zwischen zwei Typen konvertiert, wenn
der Bereich des Zieltyps größer oder gleich ist.
Zum Beispiel:
-
- Zwischen char und int
-
- Zwischen long und float
-
- Zwischen float und double
Bei Referenztypen wird implizit konvertiert zwischen einem Typ
T und seinen Obertypen.
Explizite Casts erlauben Typanpassungen, bei denen der Zieltyp den kleineren
Wertebereich umfaßt:
double d = 7.88;
long l = (long) d;
Explizite Casts also z.B.
-
- Zwischen double und float
-
- Zwischen Fließpunkt und Ganzzahl
-
- Von long nach int, short, byte oder char.
Bei solchen Typanpassungen kann man Genauigkeit verlieren:
short s = -134;
byte b = (byte) s;
Die vorderen Bits gehen verloren: b hat den Wert 122.
Für Referenztypen erlauben explizite Casts Typumwandlungen entgegen der
Klassenhierarchie, also z.B. vom Obertyp zum Untertyp
Solche Typumwandlungen heißen
- Down-Casts
- Typ-Einengung
- Narrowing Conversions
- Unsafe Casting
Sie erfordern einen Laufzeittest, ob das aktuelle Objekt tatsächlich
für den Zieltyp zulässig ist. Wenn nicht: ClassCastException.
class ober{}
class unter extends ober{}
public class classcast
{ public static void main(String argv[])
{ ober objo = new ober();
unter obju = (unter) objo;
}
}
liefert Laufzeit-Fehler
java.lang.ClassCastException: ober
Mögliche Down-Casts:
- Von Klasse S nach Klasse T, wobei S Obertyp von T ist.
- Von Klasse S nach Interface K, falls S nicht
final ist und K nicht implementiert.
- Von Klasse Object zu einem Array-Typ.
- Von Klasse Object zu einem Interface-Typ.
- Von Interface-Typ K nach Klasse T, falls T nicht
final ist.
- Von Interface-Typ K nach Klasse T, falls T
final ist und K implementiert.
- Von Interface-Typ K nach Interface-Typ J, wobei K
kein Unter-Interface von J ist, falls K und J keine Methode m
mit gleicher Signatur aber verschiedenem Ergebnistyp deklarieren.
- Von Array-Typ SC nach Array-Typ TC, falls
SC und TC Referenztypen sind und down-cast von SC nach
TC zulässig ist.
Diese Down-Casts erfordern Laufzeittests, ob der tatsächliche Wert für
den Zieltyp zulässig ist.
String Konvertierung
Es gibt Typanpassungen von jedem Typ (einschließlich Null) nach
String.
Verbotene Typanpassungen:
- Von Referenztypen zu Grundtypen.
- Von Grundtypen zu Referenztypen (außer für Strings).
- Vom Null-Typ zu Grundtypen.
- Zum Nulltyp.
- Zum Typ boolean.
- Vom Typ boolean, außer String-Konvertierung.
- Von Klasse T nach Klasse S, die nicht in Unter-/Ober-Klassen-Beziehung stehen.
- Von Klasse S nach Interface K, wenn S final ist
und K nicht implementiert.
- Von Interface K nach Klasse S, wenn S final ist
und K nicht implementiert.
- Von einer Klasse T zu einem Array-Typ, wenn T nicht
Object ist.
- Zwischen zwei Interfaces, die eine Methode gleicher Signatur aber
mit verschiedenem Ergebnistyp deklarieren.
- Von Arraytypen nach Typen ungleich Object und String.
- Von Arraytypen nach Interfaces ungleich Cloneable,
das von allen Arrays implementiert wird.
- von Array-Typ SC[] nach Array-Typ TC, wenn es keine
erlaubte Anpassung zwsichen SC und TC außer String-Konvertierung
gibt.
Next: Operatoren
Up: GrundsymboleOperatoren und Ausdrücke
Previous: Auswertungsreihenfolge
Peter Pfahler, 1997