Java Reference
In-Depth Information
befüllt werden darf. Die Überprüfung von instanceof auf einen generischen Typ ist deshalb
nicht möglich:
c instanceof GenericStack<String> //Syntaxfehler
Ebenso problematisch ist das Casten. Ein Casten eines Objekts auf z. B. GenericStack<String>
erzeugt im Gegensatz zu instanceof lediglich eine Warnung, ist aber immerhin möglich (wie
zuvor beschrieben können solche Warnungen durch eine entsprechende Annotation unter-
drückt werden). Aber auch in diesem Fall kann eine vollständige Überprüfung des Castens,
die auch den Typ des Typparameters untersucht, zur Laufzeit nicht erfolgen:
Object obj1 = new GenericStack<Integer>(10);
GenericStack<String> obj2 = (GenericStack<String>) obj1; //Warnung
Der Operator new kann auf Typparameter nicht angewendet werden, denn man kann ja
dafür nicht einfach Code erzeugen, in dem der Konstruktor von Object aufgerufen wird.
Man kann auch keine Parameterüberprüfung vornehmen, da man nicht weiß , welche Kons-
truktoren später die konkrete Klasse mitbringt:
class GenericClass<T>
{
private T t = new T(); //Syntaxfehler
...
}
Dass die Anweisung new T[length] ebenso nicht möglich ist, wurde schon erwähnt. Die
Begründung dafür gibt es aber erst in Abschnitt 1.6.
Will man ein Objekt eines Typs erzeugen, den man zur Programmierzeit noch nicht kennt,
so ist dies nicht grundsätzlich unmöglich in Java. Mit Hilfe der Refl ection lässt sich dies
realisieren, wie aber erst im folgenden Kapitel gezeigt werden wird.
Auf einen Typparameter T (Attribut, Parameter, lokale Variable) können aufgrund der Erset-
zung durch Object (für eine Klasse C<T>) bzw. durch A (für eine Klasse C<T extends A>) alle
Methoden der Klasse Object bzw. der Klasse A angewendet werden:
public class GenericClass<T>
{
private T content;
public void m()
{
String s = content.toString();
}
}
Der Typ des Attributs content ist zwar der Typparameter T. Dies ist aber kein Hindernis
dafür, dass die Methode toString der Klasse Object darauf angewendet wird.
Da im Byte-Code Informationen im Zusammenhang von Generics wegen der Typlöschung
(Type Erasure) nicht mehr vorhanden sind, ist ein Überladen von Methoden wie im folgen-
den Beispiel nicht möglich:
class A {}
class B {}
class C
 
Search WWH ::




Custom Search