Der informierte Downcast in Java
Unter einer polymorphen Quelle verstehen wir eine Methode, die Objekte verschiedener Klassen liefern kann.
- Eine polymorphe Quelle
/**
* Returns the string {@code "abc"} if the argument value is
* {@code true} and {@code java.lang.System.out} otherwise.
*
* @param value a boolean value to determine the object
* returned.
* @return the string {@code "abc"} if the argument value is
* {@code true} and {@code java.lang.System.out} otherwise.
*/java.lang.Object f( final boolean value )
{ return value ? "abc" : java.lang.System.out; }
Die Klasse eines Objekts »f(b)« ist zwar im allgemeinen unbekannt, jedoch kann man sagen, daß die Klasse des Objekts »f(true)« »java.lang.String« und die Klasse des Objekts »f(false)« »java.io.PrintStream« ist.
Um in solchen Fällen einen Ausdruck mit dem genauen Typ des Objekts zu erhalten, kann der Datentyp des Ausdrucks des Objekts in Klammern vor einem Ausdruck für das Objekt geschrieben werden.
Der folgende Ausdruck hat den Typ »java.lang.String«.
- Ausdruck
( java.lang.String )f( true )
Der folgende Ausdruck hat den Typ »java.io.PrintStream«.
- Ausdruck
( java.io.PrintStream )f( false )
Solch eine Festlegung des Typs eines Ausdrucks wird auch als ein Cast bezeichnet.
Ein Cast eines Ausdrucks in einen echten Untertyp des Ausdrucks, der hinter den Klammern des Casts steht, wird auch als Downcast bezeichnet.
Der Typ des Objekts muß dann allerdings auch tatsächlich ein Untertyp des im Cast angegebenen Typs sein; andernfalls tritt eine Ausnahmesituation auf.
Ein Programmierer kann also einen Downcast schreiben, wenn er weiß, daß das Objekt einen Untertyp des im Cast angegebenen Typs hat. Der Compiler verfügt im allgemeinen nicht über diese Information, weswegen sie ihm vom Programmierer durch den Cast gegeben werden muß. Da der Programmierer hier also über den Typ des Objekts informiert ist und deswegen den Downcast schreiben kann, sprechen wir hier auch von einem informierten Downcast.
Main.java
public final class Main
{static java.lang.Object f( final boolean value )
{ return value ? "abc" : java.lang.System.out; }public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( java.lang.String )f( true ) );java.lang.System.out.println
( ( java.io.PrintStream )f( false ) ); }}Protokoll
abc
java.io.PrintStream@15db9742