Aufrufwandlung in Java (Aufrufwandlung in Java), Lektion, Seite 723215
https://www.purl.org/stefan_ram/pub/aufrufwandlung_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

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 Float

static 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?

?   Ü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. )); }}

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723215 stefan_ram:723215 Aufrufwandlung in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723215, slrprddef723215, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/aufrufwandlung_java