Gestern hatte eine Kollegin ein Problem, dass uns etwas Kopfzerbrechen bereitete. Sie hatte in ihrem Code eine ClassCastException, wo wir keine erwarteten.
Sie hatte eine mit Generics spezifizierte LinkedList (sagen wir mal mit Klasse A) und als sie eine Zuweisung der Art
LinkedList<A> liste = new LinkedList<A>();
...
A obj = liste.get(0);
ausführte, flog eine ClassCastException. Wir fragten uns dann natürlich, wie es sein kann, dass ein Objekt einer anderen Klasse in der Liste steckt. Schließlich sollten die Generics gerade das verhindern, so, dass der Fehler nicht zur Laufzeit, sondern schon zur Compilerzeit auftritt. Nunja, des Rätsels Lösung war dann recht einfach. Sie hatte an anderer Stelle eine Liste die ohne Generics spezifiert war und hatte sie prompt mit einem falschen Objekt gefüllt. Anschließend übergab sie diese nicht-generic Liste als Parameter der Methode addAll(Collection<? extends E> c). Auch wenn die Parameter-Deklaration eigentlich vermuten lässt, dass hier auch nur Collections mit entsprechendem Typ erlaubt sind, scheint das nicht der Fall zu sein. Die generic Liste schluckte die falschen Objekte ohne zu murren.
LinkedList<String> genericList = new LinkedList<String>();
LinkedList nonGenericList = new LinkedList();
nonGenericList.add(new Integer(1));
genericList.addAll(nonGenericList); // funktioniert, obwohl genericList nur Strings erlaubt
String result = genericList.get(0); // ClassCastException
Deshalb: benutzt eure Generics konsequent.
Kommentare