make tablicaList.toArray () zwraca bardziej szczegółowe typy


189

Tak więc normalnie ArrayList.toArray()zwróciłby rodzaj Object[].... ale przypuszczam, że jest to Arraylistobiekt Custom, jak zrobić, aby toArray()zwrócić rodzaj Custom[]zamiast Object[]?


1
Istnieją 2 metody o tej samej nazwie „toArray ()” w ArrayList. Począwszy od 1.5, druga metoda przyjmuje tablicę maszynową. Szukasz rozwiązania dla wersji wcześniejszych niż 1.5?
Ritesh

Odpowiedzi:


308

Lubię to:

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

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

Przed Java6 zalecono napisanie:

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

ponieważ wewnętrzna implementacja i tak realokuje tablicę o odpowiednim rozmiarze, więc lepiej zrobić to z góry. Ponieważ Java6 jest preferowana, pusta tablica jest preferowana, patrz .toArray (nowa MyClass [0]) lub .toArray (nowa MyClass [myList.size ()])?

Jeśli twoja lista nie jest poprawnie wpisana, musisz wykonać rzutowanie przed wywołaniem Array. Lubię to:

    List l = new ArrayList<String>();

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

1
AFAIK: Ma to coś wspólnego z Javą jako całością, ponieważ nie jest w stanie używać ogólnych konstruktorów. Więc chociaż wie, że potrzebujesz go do konwersji obiektu takiego jak String [] lub MyObject [], nie może utworzyć go samodzielnie.

Co jeśli zamiast String chcemy użyć double? Wygląda na to, że zawodzi ... Możemy użyć Double, ale co jeśli chcę podwójne?
Pixel

2
@pbs Nie możesz. Ogólne elementy języka Java obsługują tylko typy referencyjne, a nie podstawowe. Auto-boxowanie / rozpakowywanie powinno jednak w większości przypadków ignorować różnicę między nimi.
solarshado

16

Tak naprawdę nie musi zwracać Object[], na przykład:

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

Oto moja Customklasa: -

public class Custom {
    private int i;

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

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


1

Mam odpowiedź ... wydaje się, że działa idealnie dobrze

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

Próbki:

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

1
Co jeśli mamy ArrayList <Animal> i zawiera ona typy psów i kotów, które rozszerzają Animal? Wygląda na to, że zawiódłby, gdyby pierwszym elementem był Pies, a następnym Cat. Widzi pierwszy element, tworzy tablicę typu Pies, dodaje psa, a następnie próbuje dodać kota i kończy się niepowodzeniem. Również może nie działać z generycznym E.
ptoinson
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.