Datentypen Generisches Array erstellen

Murphy23

Mitglied
Hallo zusammen,

ich möchte gerne ein generisches Array erstellen, die Länge möchte ich mittels einer Variable im Konstruktor initialisieren, jedoch funktioniert das nicht so wie ich mir das vorstelle. Hier mal der Auszug des Codes:

public class ArrayList <T>{
private int laenge;
private T[] array = new T[laenge];

public ArrayList(){
this.laenge = 100;
}
}​

Als Fehlermeldung sagt er mir "Cannot create a generic array of T".
Vielleicht kann mir jemand von euch weiterhelfen?

lg, Murph
 
Das geht so auch nicht.

Versuch es mal mit:
Java:
public class GenArray<T>{
    private T[] array;

    public GenArray(Class<T> classOfType, int size){
        @SuppressWarnings("unchecked")
        final T[] array =(T[])Array.newInstance(classOfType, size);
        this.array = array;
    }

    T get(int index){
        return array[index];
    }
}

Den Codeschnipsel hatte ich mir mal gespeichert. ^^

Oft ist es aber auch viel interessanter, wieso du genau so ein Array brauchst? Gibt es nicht eine elegantere Lösung?
 
Hallo Jardcore,

danke schonmal für den Code, werde ich gleich ausprobieren.

Nun ja im Prinzip soll ich die Funktionalität einer ArrayList nachbauen. Das heißt ich muss generische Datentypen in einem Array speichern können und dieses Array bei Bedarf vergrößern, ansonsten so Funktionen wie add, getSize, remove, etc.. Falls es dafür eine elegantere Lösung gibt (die Sache mit dem generischen Array), ich bin für alles offen.

lg Murph
 
Dann schau dir doch einfach mal die Implementierung von der ArrayList<> an 🙂

Java:
    transient Object[] elementData;

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }

    @SuppressWarnings("unchecked")
    E elementData(int index) {
        return (E) elementData[index];
    }

Hier wird einfach immer von Object auf E gecastet komme was wolle 🙂
 
Danke, das hat mir weitergeholfen!

Habe es jetzt einfach so gelöst:

private T[] array = (T[]) new Object[laenge];

...funktioniert anscheinend mit einem einfachen Cast.
 

Zurück
Oben