Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Problem mit Generics

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Registrierter Benutzer
    Registriert seit
    29.07.2001
    Ort
    Wien
    Beiträge
    90

    Problem mit Generics

    Ich habe eine generische Klasse, die eine Collection in ein Array umwandeln soll:

    Code:
    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):
    Code:
    public class Usermanager extends Manager<User>
    Wenn ich die toArray Methode aber in den Usermanager kopiere funktioniert alles wunderbar:
    Code:
        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...
    Diese Message wurde erstellt mit freundlicher Unterstützung eines frei-
    laufenden Pinguins aus artgerechter Freilandhaltung. Er ist garantiert
    frei von Micro$oft'schen Viren.

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Ich denke du mußt statt dem
    Code:
    new Object[]
    ein
    Code:
    new E[]
    machen

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    29.07.2001
    Ort
    Wien
    Beiträge
    90
    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 2 3 4
    Diese Message wurde erstellt mit freundlicher Unterstützung eines frei-
    laufenden Pinguins aus artgerechter Freilandhaltung. Er ist garantiert
    frei von Micro$oft'schen Viren.

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Unglaublich

    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
    Code:
    T[] variable
    während du das hier hast
    Code:
    E variable[]
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •