Generische Liste selber schreiben



  • Hallo,

    ich will einen generischen Container schreiben. Ich soll dabei NICHT irgendeine vorhandene Containerklasse aus der Java API benutzen.
    Meine 1. Idee war das (komme aus der C++ Ecke):

    public class Urne<T> {
    private T[] urne;
    private int anzahl;
    public Urne() {
       urne = new T[100];
       anzahl = 0;
    }
    

    Aber das new im Ctor gibt einen Compiler Error.

    Meine Fragen:
    Wieso geht das nicht und wie soll ich denn sonst die Daten speichern, wenn ich kein Array vom Typ T anlegen darf? 😕



  • Ja, das hat mich auch schon irritiert. Du darfst kein Array vom Typ T anlegen. Du darfst aber ein Array vom Typ Object anlegen. Braucht dann aber ein paar unschöne Casts :(.



  • javaler schrieb:

    Wieso geht das nicht

    Generics sind in Java nur zur Compilezeit vorhanden, das Array erzeugst Du aber zur Laufzeit. Da Du zur Laufzeit T aber nicht mehr kennst, kannst Du auch kein T-Array erzeugen. In dem Zusammenhang wirst Du um Casts nicht herumkommen.



  • Na toll. Dann ist also die einzige Möglichkeit, selber eine generische Datenstruktur zu schreiben, die Benutzung eines generell Object Arrays? Dann kann ich mir doch das Generic gleich sparen?
    Ich versteh nicht, wieso ein new T[100] nicht geht? Ich dachte durch Type Erasure wird T einfach durch Object (oder ein Bound) ersetzt.

    Also sollte doch aus dem hier:

    public class Urne<T> {
    private T[] urne;
    private int anzahl;
    public Urne() {
       urne = new T[100];
       anzahl = 0;
    }
    

    das werden:

    public class Urne {
    private Object[] urne;
    private int anzahl;
    public Urne() {
       urne = new Object[100];
       anzahl = 0;
    }
    

    Aber das sollte dann doch gehen. Oder wo liegt da mein Fehler?



  • Die Object-Übelkeiten verschwinden dann auf dem Weg aus deiner Klasse hinaus, das Interface bleibt also generisch.

    Gibt einige solcher Hässlichkeiten in Java - und auch in allen anderen Sprachen - aber das fand' ich auch schon mal sehr lästig 😞

    MfG SideWinder



  • In den Java Generics wird das auch genauso gemacht. Als Object speichern und erst
    bei get Operationen oder ähnlichem wird auf T gecastet.


Anmelden zum Antworten