ClassCastException bei generischer Klasse

Shiby

Mitglied
Hallo Leute,
Wieso bekomme ich bei dieser Codezeile immer eine ClassCastException?
Wenn ich das ohne Type- Bounde benutze gibt es keine Exception.
Ich hoffe jemand kann mir weiterhelfen.

Java:
public abstract class Table<I extends Information> 
{	
	private I[] array = (I[]) new Object[10];
}
 
Die Frage ist eigentlich nicht wieso es mit dem oben geposteten Code nicht klappt (siehe Harrys Antwort), sondern wieso es zunächst scheinbar klappt wenn man das extends weglässt (was Shiby ja auch gefragt hat). Ich hab mal etwas experimentiert und habe ein noch seltsameres Verhalten produziert:
Java:
public class GenericTest<I> {

    I[]    array    = (I[]) new Object[] { new Integer( 1 ), "hallo", Boolean.TRUE };

    public void printInfo() {
        System.out.println( array.getClass() );
    }

    public static void main( String[] args ) throws Exception {
        final GenericTest<String> test = new GenericTest<String>();
        test.printInfo(); // Object Array
        System.out.println( test.array.getClass() ); // ClassCastException
    }

}
Ich gebe als Typ String an. Es gibt trotzdem keine Exception beim initialisieren des Arrays array. Das Verhalten ist wie schon von Shiby beschrieben. Aber noch merkwürdiger ist:
In der dritten Zeile der main gibt es eine ClassCastException, obwohl dort genau das gleiche gemacht wird wie in einer Zeile zuvor. Und dort gab es keine Exception !?!?
 
Das mit der ClassCastException ist doch ganz einfach. Der Compiler versucht typsicher zu arbeiten.
Bei deiner printInfo-Methode wird dieser Typ aber nicht explizit benötigt und weil type-erasure passiert, wird hier nichts geworfen.
Anders rum, wenn du dir das Array rausholst versucht der Compiler dir zu garantieren, dass das ein I-Array ist - was es nicht ist - und wirft dir somit eine ClassCastException.
 
Zuletzt bearbeitet:
Das Problem ist halt, das generische Typen nur vom Compiler getrickst werden. Die JVM kennt effektiv keine generischen Typen.
Eine kleiner Workaround ist der folgende:
Java:
public static class GenericTest<I> {
	private I[] array;
	public GenericTest(Class<I> clazz) {
		array = (I[])Array.newInstance(clazz, 10);
	}
}
//und erzeugt wird es z.b. so:
GenericTest<String> test = new GenericTest<>(String.class);
 

Neue Themen


Zurück
Oben