Java Reference
In-Depth Information
Der Code verursacht weder Compiler- noch Laufzeitfehler, also insbesondere auch keine
ClassCastExceptions. Das heißt, dass tatsächlich Objekte des Typs String bzw. StringBuff er
erzeugt werden. Würde man als String allerdings „java.lang.Integer“ angeben, würde eine
InstantiationException geworfen, da Integer keinen parameterlosen Konstruktor hat.
In diesem Zusammenhang soll auch noch kurz auf die Problematik eingegangen werden,
dass auch kein Feld für einen Typparameter T erzeugt werden kann und der Ausdruck new
T[length] ebenfalls als syntaktisch falsch vom Compiler gekennzeichnet wird. Mit der
statischen Methode newInstance der Klasse Array, die ebenfalls zu den Refl ection-Klassen
ge hört, lässt sich aber trotzdem ein Feld erzeugen, dessen Typ zur Zeit des Programmierens
noch nicht bekannt sein muss:
Class<?> c = Class.forName("java.lang.String");
String[] sArray = (String[]) Array.newInstance(c, 10);
System.out.println(sArray.getClass().getName());
c = Class.forName("java.lang.Integer");
Integer[] iArray = (Integer[]) Array.newInstance(c, 20);
System.out.println(iArray.getClass().getName());
Die Ausgabe dazu lautet:
[Ljava.lang.String;
[Ljava.lang.Integer;
Es wurden also tatsächlich Objekte des Typs String[] und Integer[] erzeugt.
2.2 Refl ection mit Generics
Zwar ist die Klasse Class selbst eine generische Klasse, wie wir im vorigen Abschnitt gese-
hen haben. Dennoch wurde in der Beschreibung bisher außer Acht gelassen, dass die Klas-
sen, Schnittstellen, Methoden und Konstruktoren, die durch die Refl ection-Klassen Class,
Method und Constructor beschrieben werden, selbst generisch sein können und dass
dadurch Attribut-, Parameter- und Rückgabetypen generische Typen oder Typvariablen
sein können. Derartige Sachverhalte können mit den bisher besprochenen Klassen und
Methoden nicht herausgefunden werden. Um dies zu erläutern, betrachten wir die folgen-
den Beispielklassen:
Listing 2.2 Beispielklassen mit Generics
package javacomp.basics;
class A<T1, T2> {}
class B<T1, T2> extends A<T1, C>
{
private A<T2,D> a;
public A<T2,D> m(B<C,D> b)
{
return a;
}
}
 
Search WWH ::




Custom Search