make arrayList.toArray () gibt spezifischere Typen zurück


189

Normalerweise ArrayList.toArray()würde also eine Art von Object[]... zurückgegeben, aber angenommen, es ist ein ArraylistObjekt Custom. Wie kann ich toArray()eine Art von zurückgeben Custom[]anstatt Object[]?


1
In ArrayList gibt es zwei Methoden mit demselben Namen 'toArray ()'. Ab 1.5 verwendet die zweite Methode ein typisiertes Array. Suchen Sie eine Lösung für Pre-1.5?
Ritesh

Antworten:


308

So was:

List<String> list = new ArrayList<String>();

String[] a = list.toArray(new String[0]);

Vor Java6 wurde empfohlen zu schreiben:

String[] a = list.toArray(new String[list.size()]);

da die interne Implementierung ohnehin ein Array mit der richtigen Größe neu zuweisen würde, sollten Sie dies besser im Voraus tun. Da Java6 das leere Array bevorzugt wird, siehe .toArray (neue MyClass [0]) oder .toArray (neue MyClass [myList.size ()])?

Wenn Ihre Liste nicht richtig eingegeben wurde, müssen Sie eine Besetzung durchführen, bevor Sie toArray aufrufen. So was:

    List l = new ArrayList<String>();

    String[] a = ((List<String>)l).toArray(new String[l.size()]);

1
AFAIK: Dies hat etwas mit Java als Ganzes zu tun, da keine generischen Konstruktoren verwendet werden können. Obwohl es weiß, dass Sie es benötigen, um ein Objekt wie String [] oder MyObject [] zu konvertieren, kann es es nicht selbst instanziieren.

Was ist, wenn wir anstelle von String double verwenden möchten? Es scheint zu scheitern ... Wir können Double verwenden, aber was ist, wenn ich Double möchte?
Pixel

2
@pbs Du kannst nicht. Die Generika von Java unterstützen nur Referenztypen, keine Grundelemente. Beim automatischen Boxen / Entpacken sollten Sie den Unterschied zwischen ihnen jedoch größtenteils ignorieren.
Solarshado

16

Es muss nicht wirklich zurückkehren Object[], zum Beispiel: -

    List<Custom> list = new ArrayList<Custom>();
    list.add(new Custom(1));
    list.add(new Custom(2));

    Custom[] customs = new Custom[list.size()];
    list.toArray(customs);

    for (Custom custom : customs) {
        System.out.println(custom);
    }

Hier ist meine CustomKlasse: -

public class Custom {
    private int i;

    public Custom(int i) {
        this.i = i;
    }

    @Override
    public String toString() {
        return String.valueOf(i);
    }
}


1

Ich habe die Antwort bekommen ... das scheint perfekt zu funktionieren

public int[] test ( int[]b )
{
    ArrayList<Integer> l = new ArrayList<Integer>();
    Object[] returnArrayObject = l.toArray();
    int returnArray[] = new int[returnArrayObject.length];
    for (int i = 0; i < returnArrayObject.length; i++){
         returnArray[i] = (Integer)  returnArrayObject[i];
    }

    return returnArray;
}

0
@SuppressWarnings("unchecked")
    public static <E> E[] arrayListToArray(ArrayList<E> list)
    {
        int s;
        if(list == null || (s = list.size())<1)
            return null;
        E[] temp;
        E typeHelper = list.get(0);

        try
        {
            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (E[]) o;

            for (int i = 0; i < list.size(); i++)
                Array.set(temp, i, list.get(i));
        }
        catch (Exception e)
        {return null;}

        return temp;
    }

Proben:

String[] s = arrayListToArray(stringList);
Long[]   l = arrayListToArray(longList);

1
Was ist, wenn wir ArrayList <Animal> haben und es Hunde- und Katzentypen enthält, die Animal erweitern? Es scheint, als würde es scheitern, wenn das erste Element Hund und das nächste Katze ist. Es sieht das erste Element, erstellt ein Array vom Typ Hund, fügt den Hund hinzu, versucht dann, die Katze hinzuzufügen, und schlägt fehl. Funktioniert möglicherweise auch nicht mit generischem E.
Ptoinson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.