Der Typ eines Parameters in Java
Die Anforderungen an Parametertypen ℳ
ℛ Substitutionsprinzip für Initialisierungsausdrücke (Wiederholung) Der Typ des Initialisierungsausdrucks muß ein Untertyp des Typs der zu initialisierenden Variablen sein.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final int n = 2;
final java.lang.String text = "abc";
final java.io.PrintStream out = java.lang.System.out;
out.println( n );
out.println( text ); }}transcript
2
abc
ℛ Substitutionsprinzip für Argumente (Wiederholung) Der Typ eines Arguments muß ein Untertyp des Typs des zugehörigen Parameters sein.
Das folgende Programmbeispiel zeigt eine Entsprechung mit Parametern.
Main.java
public final class Main
{public static void method
( final int n,
final java.lang.String text,
final java.io.PrintStream out )
{ out.println( n );
out.println( text ); }public static void main( final java.lang.String[] args )
{ method( 2, "abc", java.lang.System.out ); }}transcript
2
abc
Motivation für die Wahl von Parametertypen ℳ
Wenn ein Objekt des Typs »java.lang.CharSequence« verlangt wird, so liegt dies normalerweise daran, daß die Methoden dieses Typs (wie zum Beispiel »length()«, »charAt(int)«, »subSequence(int,int)« und/oder »toString«) benötigt werden. Ein Objekt eines Untertyps, wie des Typs »java.lang.String«, enthält aber auch diese Methoden und ist daher ebenfalls akzeptabel.
Main.java
public final class Main
{public static void m( final java.lang.CharSequence sequence )
{ int begin; int top;
java.lang.System.out.printf( "%s%n%s%n%s%n%s%n",
sequence.length(),
sequence.charAt( 0 ),
sequence.subSequence( begin = 0, top = 3 ),
sequence.toString() ); }public static void main( final java.lang.String[] args )
{ m( "Alpha" ); }}transcript
5
A
Alp
Alpha
Durch die Wahl des Parametertyps »java.lang.CharSequence« wird ausgedrückt:
„Ich brauche die Methoden »length()«, »charAt(int)« »subSequence(int,int)« und »toString(int,int)«, aber beispielsweise nicht »indexOf(int)« oder »substring(int)«.“
Wiederholung von Regeln in Zusammenhang mit Typen
ℛ Statische Typfestlegungen Der Typ einer Variablen legt den Typ fest, den der Name der Variablen hat, wenn man ihn als Ausdruck verwendet. Genauso legt der Rückgabetyp einer Methode den Typ eines Aufrufs jener Methode (als Ausdruck betrachtet) fest.
ℛ Objektregel Der Typ eines Objektes muß ein Untertyp des Typs eines Ausdrucks (also auch eines Namens) für das Objekt sein.
ℛ Faustregel für Variablentypen Der Typ einer Variablen sollte im Zweifelsfall der Typ des Initialisierungsausdrucks sein.
ℛ String-Regel Ein Zeichenfolgenliteral hat den Typ »java.lang.String«. Sein Wert ist ein Objekt, welches die Klasse »java.lang.String« hat.
Wiederholung einiger Substitutionsprinzipien
Substitutionsprinzip für Initialisierungsausdrücke
ℛ Substitutionsprinzip für Initialisierungsausdrücke Der Typ des Initialisierungsausdrucks muß ein Untertyp des Typs der zu initialisierenden Variablen sein.
Andere Substitutionsprinzipien
ℛ Substitutionsprinzip für rechtsseitige Ausdrücke Der Typ der rechten Seite einer Zuweisung muß ein Untertyp des Typs der linken Seite sein.
ℛ Substitutionsprinzip für Argumentausdrücke Der Typ eines Arguments muß ein Untertyp des Typs des zugehörigen Parameters sein.
ℛ Substitutionsprinzip für Rückgabeausdrücke Der Typ eines Rückgabeausdrucks muß ein Untertyp des Typs der zugehörigen Methode sein.
Übungsfragen
? Übungsfrage
Was kann über den Typ des Objekts »cs« bei der Ausführung des Rumpfes der folgenden Methodendeklaration gesagt werden?
(Jener Typ wird in jenem Rumpfe auch von der Ausgabeanweisung ausgegeben.)
Was wären zwei Beispiele für mögliche Typen des Objekts »cs« bei der Ausführung des Rumpfes der folgenden Methodendeklaration?
- Methodendeklaration
public static void method( final java.lang.CharSequence cs )
{ java.lang.System.out.println( cs.getClass() ); }
? Übungsfrage (1)
Kann das folgende Programm voraussichtlich ohne Fehlermeldung übersetzt werden?
Main.java
public final class Main
{public static void method( final java.lang.Object o )
{ o.subSequence( 0, 0 ); }public static void main( final java.lang.String[] args )
{ final java.lang.CharSequence cs = "abc";
method( cs ); }}
? Übungsfrage (2)
Kann das folgende Programm voraussichtlich ohne Fehlermeldung übersetzt werden?
(Das Hauptprogramm unterscheidet sich nicht von dem der vorigen Übungsfrage.)
Main.java
public final class Main
{public static void method( final java.lang.CharSequence cs )
{ cs.subSequence( 0, 0 ); }public static void main( final java.lang.String[] args )
{ final java.lang.CharSequence cs = "abc";
method( cs ); }}
? Übungsfrage (3)
Kann das folgende Programm voraussichtlich ohne Fehlermeldung übersetzt werden?
(Das Hauptprogramm unterscheidet sich nicht von dem der vorigen Übungsfrage.)
Main.java
public final class Main
{public static void method( final java.lang.String cs )
{ cs.subSequence( 0, 0 ); }public static void main( final java.lang.String[] args )
{ final java.lang.CharSequence cs = "abc";
method( cs ); }}