make arrayList.toArray () restituisce tipi più specifici


189

Quindi, normalmente ArrayList.toArray()restituirebbe un tipo di Object[].... ma supponiamo che sia un Arraylistoggetto Custom, come faccio toArray()a restituire un tipo Custom[]piuttosto che Object[]?


1
Esistono 2 metodi con lo stesso nome 'toArray ()' in ArrayList. A partire dalla 1.5, il secondo metodo prende l'array tipizzato. Stai cercando una soluzione pre-1.5?
Ritesh,

Risposte:


308

Come questo:

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

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

Prima di Java6 si consigliava di scrivere:

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

perché l'implementazione interna riallocherebbe comunque un array di dimensioni adeguate, quindi è meglio farlo in anticipo. Poiché Java6 è preferito l'array vuoto, consultare .toArray (new MyClass [0]) o .toArray (new MyClass [myList.size ()])?

Se il tuo elenco non è stato digitato correttamente, devi fare un cast prima di chiamare Array. Come questo:

    List l = new ArrayList<String>();

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

1
AFAIK: Questo ha qualcosa a che fare con Java nel suo insieme, non potendo usare costruttori generici. Quindi, pur sapendo che ne hai bisogno per convertirti un oggetto come String [] o MyObject [], non può istanziarlo da solo.

Che cosa succede se invece di String vogliamo usare il doppio? Sembra fallire ... Possiamo usare Double, ma cosa succede se voglio double?
Pixel

2
@pbs Non puoi. I generici di Java supportano solo tipi di riferimento, non primitivi. Tuttavia, il boxing automatico / unboxing dovrebbe consentire di ignorare la differenza tra loro per la maggior parte.
solarshado,

16

Non è necessario tornare Object[], ad esempio:

    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);
    }

Ecco la mia Customclasse: -

public class Custom {
    private int i;

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

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


1

Ho avuto la risposta ... sembra funzionare perfettamente

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;
    }

Campioni:

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

1
Cosa succede se disponiamo di ArrayList <Animale> e contiene tipi di cani e gatti che estendono gli animali? Sembra che fallirebbe se il primo elemento è Dog e il successivo è Cat. Vede il primo elemento, crea una matrice di tipo Cane, aggiunge il cane quindi cerca di aggiungere il gatto e fallisce. Inoltre, potrebbe non funzionare con E.
ptoinson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.