Java Reference
In-Depth Information
Eine ähnliche Problematik hat man übrigens bei Feldern, wobei die Situation hier jedoch
eine andere ist. Die folgenden Zuweisungen sind nämlich durchaus problemlos möglich:
String[] strArray = new String[10];
Object[] objArray = strArray;
Man könnte nun versucht sein, über die Variable objArray ein Objekt, das kein String ist, in
dem String-Feld zu speichern und über die Variable strArray auf den vermeintlichen String
zuzugreifen. Allerdings scheitert dies bereits beim Versuch des Abspeicherns eines Objekts,
das kein String ist, in objArray:
objArray[0] = new Integer(1); //ArrayStoreException
String s = strArray[0]; //wird nicht mehr ausgeführt wegen Ausnahme
Obwohl dies kein Syntaxfehler ist, passiert beim Ausführen ein Laufzeitfehler in Form einer
ArrayStoreException. Dies liegt daran, dass ein Feldobjekt, obwohl es nur eine Folge von
Objektreferenzen enthält, den Typ dieser Feldelemente kennt, so dass zur Laufzeit geprü
und erkannt werden kann, ob die im Feld abzulegende Objektreferenz passend zum Typ des
Felds ist. Dies dür e vermutlich der Grund sein, warum die Anweisung new T[] für einen
Typparameter T nicht möglich ist (vgl. Abschnitt 1.2), denn wenn dafür Code der Form new
Object[] erzeugt würde und zur Laufzeit für T die Klasse String gesetzt wird, dann hat
man eben kein String[]-Objekt, sondern ein Object[]-Objekt, was nicht das ist, was man
erwarten würde.
Ein Casten eines Objekts auf einen generischen Typ wie z. B. GenericStack<Object> erzeugt
zwar eine Warnung, ist aber möglich (wie zuvor beschrieben können solche Warnungen
durch eine entsprechende Annotation unterdrückt werden):
GenericStack<String> gss = new GenericStack<String>(10);
Object o = gss;
GenericStack<Object> gso = (GenericStack<Object>) o;
Auf diese Weise kann das obige Szenario, das durch die Inkompatibilität von Generic-
Stack<String> und GenericStack<Object> verhindert wurde, doch realisiert werden:
gso.push(new Integer(3));
String s = gss.pop(); //ClassCastException
Im Unterschied zum Beispiel oben wird beim Ablegen eines Integer-Objekts im Generic-
Stack<String> über die Referenz gso keine Ausnahme erzeugt, da man dies wegen der
Typlöschung zur Laufzeit nicht feststellen kann (im Gegensatz zu Feldern). Allerdings wird
bei der Zuweisung des von pop zurückgelieferten Integer-Objekts an eine String-Variable
eine ClassCastException geworfen.
Aufgrund der bisherigen Beschreibungen könnte man vermuten, dass es im Zusammen-
hang mit Generics keine Typkompatibilität gibt. Dies stimmt jedoch nicht, da es zum einen
rohe Typen und zum anderen Wildcards gibt.
 
Search WWH ::




Custom Search