Java Reference
In-Depth Information
class C {}
class D {}
Wenn man das Programm aus Listing 2.1 auf die Klasse B anwendet, dann wird für die
Methode m ausgegeben, dass diese Methode einen Parameter des Typs B und einen Rück-
gabewert des Typs A besitzt. Wenn man sich jetzt daran erinnert, dass es die Typlöschung
(Type Erasure) gibt, könnte man meinen, dass Informationen über Generics-Eigenscha en
zur Laufzeit grundsätzlich nicht vorhanden sind. Dies stimmt aber nicht. Die Typlöschung
bezieht sich auf den vom Compiler erzeugten Byte-Code. Im Gegensatz dazu kann man über
R e fl ection durchaus Generics-Informationen herausfi nden. In Refl ection wurden zu diesem
Zweck neue Klassen und Schnittstellen eingeführt. Auß erdem wurden die vorhandenen
Klassen wie Class, Field, Constructor und Method um entsprechende Methoden erweitert.
Dies macht Refl ection deutlich komplizierter.
2.2.1 Refl ection-Typsystem
In der Zeit vor Generics war ein Typ ein primitiver Typ, eine Klasse oder eine Schnittstelle.
Wie Sie in Abschnitt 2.1 gesehen haben, können alle diese Typen durch ein Class-Objekt
repräsentiert werden. Mit Generics erweitert sich der Begriff Typ. Betrachten wir dazu die
Klasse X:
class X<T>
{
public void m(T t) ...
}
Der Parametertyp der Methode m ist im obigen Beispiel der Typparameter T der Klasse X.
Dieser Typ T kann nicht durch ein Class-Objekt repräsentiert werden. Der Begriff Typ wurde
deshalb verallgemeinert. Zu diesem Zweck wurde die Schnittstelle Type in Refl ection einge-
führt. Type ist eine leere Schnittstelle (sie besitzt keine Methoden). Sie dient lediglich dazu,
unterschiedliche Arten von Typen zusammenzufassen. Folgende Arten von Typen gibt es:
! Class: Was mit einem Class-Objekt beschrieben werden kann, ist selbstverständlich eine
Variante eines Typs. Es ist deshalb wenig überraschend, dass die Klasse Class die Schnitt-
stelle Type implementiert.
! TypeVariable: Allerdings gibt es auch die Schnittstelle TypeVariable, die Type erweitert
und mit der Typparameter (wie T im obigen Beispiel) repräsentiert werden. Da Typvaria-
ble durch extends eingeschränkt sein können, besitzt die Schnittstelle TypeVariable eine
Methode namens getBounds, mit der die beschränkenden Typen herausgefunden werden
können (Rückgabetyp Type[]).
! ParameterizedType: Für generische Typen wie z. B. ArrayList<String> gibt es die Schnitt-
stelle ParameterizedType, die ebenfalls Type erweitert. Die Typargumente (im Allgemei-
nen können es mehrere sein), die durch die Methode getActualTypeArguments erfragt
werden können, können nicht in allen Fällen durch Class-Objekte beschrieben werden,
denn z. B. ist bei ArrayList<ArrayList<String>> das Typargument wieder ein Parameter-
izedType. Aber auch ArrayList<T> für einen Typparameter T ist möglich. Im Allgemeinen
sind die Typargumente somit wieder Types; die Methode getActualTypeArguments liefert
 
Search WWH ::




Custom Search