Aufrufwandlung in Java
Erweiternde Wandlungen
Da man sich den Obertyp »double« als umfangreicher als den Untertyp »int« vorstellt, spricht man bei einer Wandlung von »int« nach »double« auch von einer erweiternden Wandlung. Solche erweiternden Wandlungen sind eher unproblematisch und daher meistens erlaubt.
double-Parameter und int-Argument
Der Typ eines Argumentausdrucks muß nicht unbedingt dem Typ des Parameters gleichen. Es ist auch erlaubt, daß der Argumentyp ein Untertyp des Parametertyps ist.
Weil der Typ »int« ein Untertyp des Typs »double« ist, kann ein Argument vom Typ »int« für einen Parameter vom Typ »double« verwendet werden; das folgende Programm zeigt ein Beispiel dafür.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.Math.floor( 2 )); }}java.lang.System.out
2.0
- double-Parameter und int-Argument
java.lang.Math.floor( double )
|
| ^ ist Untertyp von
|
int
|
| ^ ist Wert von
|
2
Die „Einbettung“ der int-Werte in den Datentyp »double« macht es es verständlich, daß ein int-Argumentausdruck auch bei einem double-Parameter akzeptiert wird. Der int-Wert wird dabei im Zuge der Aufrufwandlung in den ihm gleichwertigen double -Wert umgewandelt.
Man spricht hier auch von einer impliziten Typwandlung, weil die Typwandlung nicht ausdrücklich verlangt wird, sondern im Zuge des Methodenaufrufes erfolgt, solch eine implizite Typwandlung wird auch Typerzwingung (type coercion /taɪpkoˈɚʃən/) genannt.
ℛ Substitutionsprinzip Der Typ eines Ausdrucks darf in der Regel ein Untertyp des erwarteten Typs sein. Der Argumenttyp darf daher ein Untertyp des Parametertyps sein.
ℛ Substitutionsprinzip für Argumente Als Argumenttyp wird ein Untertyp des Parametertyps erwartet.
int-Parameter und double-Argument
Ein double-Wert, wie beispielsweise »2.7«, kann nicht als int-Wert angesehen werden, da der Typ »int« kein Obertyp des Typs »double« ist. Daher ist es nicht möglich, einen double-Argumentausdruck für einen int-Parameter anzugeben.
Die Methode des folgenden Beispiels hat beispielsweise einen int-Parameter, sie akzeptiert keinen double-Wert als Argument.
- Dokumentation der Methode »java.lang.Float.intBitsToFloat« (vereinfacht und gekürzt)
java.lang
Class Floatstatic float intBitsToFloat( int Bits )
- Ergibt einen Wert des Datentyps »float« mit denselben Bits wie der angegebene int-Wert.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.Float.intBitsToFloat( 0. )); }}- Fehlermeldung (übersetzt)
Main.java:4: intBitsToFloat(int) in java.lang.Float kann nicht auf (double) angewendet werden
( java.lang.Float.intBitsToFloat( 0. )); }}
^
1 Fehler- Fehlermeldung (Variante, übersetzt)
Main.java:4: unvertraegliche Typen: bei Umwandlung von double nach int ist Informationsverlust moeglich
( java.lang.Float.intBitsToFloat( 0. )); }}
^
1 Fehler
Man beachte, daß in der obenstehenden Fehlermeldung sowohl der richtige erwartete Parametertyp »int« als auch der falsche verwendete Argumenttyp »double« angegeben wird.
Parameter- und Argumenttypen
Die folgende Tabelle zeigt, welche Argumenttypen für bestimmte Parametertypen zulässig sind.
- Tabelle
Parametertyp erlaubter Argumenttyp
double double, int
int int
java.lang.String java.lang.String
Unterschied zwischen „Parameter“ und „Argument“
Wir können den Unterschied zwischen dem Begriff „Parameter“ und dem Begriff „Argument“ nun auch durch folgende Aussage illustrieren:
Der Aufruf »java.lang.Math.floor( 2 )« hat ein Argument vom Typ »int«, aber die aufgerufen Methode hat einen Parameter vom Typ »double«.
Übungsfragen _
Die Proklamation ist der Teil der Dokumentation einer Methode, welcher an ihrem Anfang steht und meist in einer dicktengleichen Schrift (Schreibmaschinenschrift) erscheint.
Wir sagen, daß ein Aufruf zu einer Proklamation „paßt“, wenn angesichts der Informationen, die man der Proklamation entnehmen kann, keine Fehlermeldung bei Verwendung des Aufrufs zu erwarten ist.
Zur Vereinfachung lassen wir bei den folgenden Übungsfragen den Namen der Klasse sowohl in der Dokumentation als auch bei dem Aufruf weg.
? Quelltext beurteilen (1) _
Paßt der Aufruf zur Proklamation?
- Proklamation einer Methode (erfundenes Beispiel)
static double f( double x )
- Aufruf einer Methode
f( 2.3 )
? Quelltext beurteilen (2) _
Paßt der Aufruf zur Proklamation?
- Proklamation einer Methode (erfundenes Beispiel)
static double f( double x )
- Aufruf einer Methode
f( 2 )
? Quelltext beurteilen (3) _
Paßt der Aufruf zur Proklamation?
- Proklamation einer Methode (erfundenes Beispiel)
static double f( double x )
- Aufruf einer Methode
f( "2.3" )
? Ausdrücke beurteilen
- Dokumentation von »java.lang.Math.random()« (überarbeitet und übersetzt)
- Paket »java.lang«, Klasse »Math«
- Proklamation:
static double random()
- Prosa:
- Ergibt einen double-Wert größer oder gleich »0.0« und kleiner als »1.0«.
- Aussprachehinweis
- math random ˈmæθ. ˈræn.dm
- Dokumentation einer Methode mit einem Parameter (überarbeitet und übersetzt)
- Paket »java.lang«, Klasse »Math«
- Proklamation:
static double floor( double a )
- Prosa:
- Ergibt den größten double-Wert, der kleiner als »a« oder gleich »a« ist und bei dem alle Nachkommastellen gleich »0« sind.
Welcher der folgenden Aufrufe ist erlaubt?
- »java.lang.Math.random( 1 )«
- »java.lang.Math.random( 1.0 )«
- »java.lang.Math.random( "1.0" )«
- »java.lang.Math.floor( 1 )«
- »java.lang.Math.floor( 1.0 )«
- »java.lang.Math.floor( "1.0" )«
? Übungsfrage
Das folgende Programm veranlaßt den JDK -Übersetzer (wenn er mit »Xdiags:verbose« aufgerufen wird) zur Ausgabe einer Fehlermeldung, die eine Beschreibung des Parameters der Methode »java.lang.Float.intBitsToFloat« enthält und eine Beschreibung des tatsächlich verwendeten Arguments enthält (Stand 2018).
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.Float.intBitsToFloat( 0. )); }}Protokoll
Main.java:4: error: method intBitsToFloat in class Float cannot be applied to given types;
( java.lang.Float.intBitsToFloat( 0. )); }}
^
required: int
found: double
reason: argument mismatch; possible lossy conversion from double to int
1 error
Was kann man der Fehlermeldung über den Parametertyp entnehmen?
Was kann man der Fehlermeldung über den Argumenttyp entnehmen?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.Float.intBitsToFloat( 0. )); }}