Konvertierung | Kein Datenverlust. Automatische Konvertierung. |
Möglicher Verlust an Genauigkeit. Automatische Konvertierung. |
Möglicher großer Verlust an Daten. Erfordert eine explizite Typumwandlung. |
---|---|---|---|
byte in short | X | ||
short in byte | X | ||
short in long | X | ||
int in float | X | ||
float in byte | X | ||
double in float | X |
Da, wo es keinen Datenverlust oder nur einen möglichen Verlust an Genauigkeit gibt, wird Java in einem Methodenaufruf den Wert automatisch in den erforderlichen Typ konvertieren.
Wenn es einen möglichen Verlust sowohl an Genauigkeit als auch an Größe gibt, verlangt Java von uns eine explizite Angabe, dass wir die Konvertierung vornehmen möchten, indem wir eine Typumwandlung vornehmen.Zum Beispiel:
Point pointA = new Point(); short a = 93, b = 92; int i = 12, j = 13; long x = 0, y = 44; double u = 13.45, v = 99.2; pointA.move( i, j ); // OK — keine Konvertierung notwendig pointA.move( a, b ); // OK — short konvertiert zu int ohne Verlust pointA.move( a, j ); // OK — short konvertiert zu int ohne Verlust pointA.move( x, y ); // NICHT OK — möglicher Verlust an // Genauigkeit und Größe. pointA.move( (int)x, (int)y ); // OK — Typumwandlung sagt fortfahren pointA.move( i, v ); // NICHT OK -- möglicher Verlust an // Genauigkeit und Größe (für v). pointA.move( i, (int)v ); // OK — Typumwandlung sagt fortfahren
Um diese Entscheidungen zu treffen, wird nur der Typ der Variablen (oder des Ausdrucks)
untersucht, NICHT der jeweilige Wert.
Zum Beispiel könnten die jeweiligen Werte (in diesem Fall) in dem ersten mit NICHT OK gekennzeichneten Methodenaufruf von long
zu int
ohne Datenverlust konvertiert werden.
Aber für andere Werte würde es einen Datenverlust geben,
also verlangt der Aufruf eine Typumwandlung.
Beachtet auch, dass die Konvertierung auf einer Parameter-für-Parameter Basis durchgeführt wird.
Im dritten Aufruf muss nur der Parameter a
konvertiert werden.
Welche der folgenden Methodenaufrufe sind korrekt?
Point pointA = new Point(); short a = 93, b = 92; int i = 12, j = 13; long x = 0, y = 44; double u = 13.45, v = 99.2; pointA.move( i, b ); pointA.move( a, x ); pointA.move( u, b );