PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Generics



ComSubVie
11-12-2006, 11:55
Ich habe eine generische Klasse, die eine Collection in ein Array umwandeln soll:


public abstract class Manager<E> {
public E[] toArray( Collection<E> collection ) {
@SuppressWarnings( "unchecked" )
E retVal[] = (E[]) new Object[collection.size()];
int i = 0;
for ( Iterator<E> it = collection.iterator(); it.hasNext(); i++ ) {
retVal[i] = it.next();
}
return retVal;
}
}

wenn ich jetzt eine klasse daraus ableite und toArray verwende, erhalte ich eine ClassCastException (die exakte Quelle ist nicht wirklich lokalisierbar, ist ein JBoss):

public class Usermanager extends Manager<User>

Wenn ich die toArray Methode aber in den Usermanager kopiere funktioniert alles wunderbar:

public User[] toArray( Collection<User> collection ) {
@SuppressWarnings( "unchecked" )
User retVal[] = new User[collection.size()];
int i = 0;
for ( Iterator<User> it = collection.iterator(); it.hasNext(); i++ ) {
retVal[i] = it.next();
}
return retVal;
}

Woran könnte das liegen? In der generischen Klasse muss ich leider von Object auf E casten, weil erasure das so will. Laut Bruce Eckel sollte das auch so funktionieren (und in einer kleinen Minidemo hat das bei mir auch keine Probleme gemacht).

Irgendeine Idee woran das liegen könnte? Ich würde es gerne vermeiden die Funktion in allen nichtgenerischen Klassen neu zu implementieren...

anda_skoa
12-12-2006, 17:39
Ich denke du mußt statt dem


new Object[]

ein


new E[]

machen

Ciao,
_

ComSubVie
12-12-2006, 18:48
Tja, das wäre schön. Aber leider geht das nicht. Der Grund nennt sich erasure. Bruce Eckel hat dazu mal ein bisschen etwas geschrieben (Teil 2 find ich am unterhaltsamsten): 1 (http://www.mindview.net/WebLog/log-0057) 2 (http://www.mindview.net/WebLog/log-0058) 3 (http://www.mindview.net/WebLog/log-0059) 4 (http://www.mindview.net/WebLog/log-0060)

anda_skoa
14-12-2006, 16:10
Unglaublich :eek:

Nachdem das Beispiel aber ziemlich ähnlich wie dein Code ist, fällt mir als Unterschied nur auf, daß der Beispiel Code die Variable so deklariert


T[] variable

während du das hier hast


E variable[]


Ciao,
_