make arrayList.toArray () mengembalikan tipe yang lebih spesifik

189

Jadi, biasanya ArrayList.toArray()akan mengembalikan jenis Object[].... tetapi seharusnya itu adalah Arraylistobjek Custom, bagaimana cara membuat toArray()untuk mengembalikan jenis Custom[]bukan Object[]?

kamikaze_pilot
sumber
1
Ada 2 metode dengan nama yang sama 'toArray ()' di ArrayList. Mulai dari 1,5, metode kedua mengambil array yang diketik. Apakah Anda mencari solusi untuk pra-1.5?
Ritesh

Jawaban:

308

Seperti ini:

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

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

Sebelum Java6 disarankan untuk menulis:

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

karena implementasi internal akan merealokasi array dengan ukuran yang benar sehingga Anda lebih baik melakukannya dimuka. Karena Java6 array kosong lebih disukai, lihat .toArray (MyClass baru [0]) atau .toArray (MyClass baru [myList.size ()]))?

Jika daftar Anda tidak diketik dengan benar, Anda perlu melakukan casting sebelum memanggil toArray. Seperti ini:

    List l = new ArrayList<String>();

    String[] a = ((List<String>)l).toArray(new String[l.size()]);
Mihai Toader
sumber
1
AFAIK: Ini ada hubungannya dengan Jawa secara keseluruhan, karena tidak dapat menggunakan konstruktor generik. Jadi, meskipun ia tahu Anda membutuhkannya untuk mengonversi objek Anda seperti String [] atau MyObject [], ia tidak bisa instantiate sendiri.
Bagaimana jika alih-alih String yang ingin kita gunakan ganda? Tampaknya gagal ... Kita bisa menggunakan Double, tetapi bagaimana jika saya ingin double?
Pixel
2
@ pbs Anda tidak bisa. Obat generik Java hanya mendukung jenis referensi, bukan primitif. Auto-boxing / unboxing seharusnya membuat Anda mengabaikan perbedaan di antara mereka untuk sebagian besar.
solarshado
16

Tidak perlu kembali Object[], misalnya: -

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

Inilah Customkelas saya : -

public class Custom {
    private int i;

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

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

Saya mendapat jawabannya ... ini tampaknya berfungsi dengan baik

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

Sampel:

String[] s = arrayListToArray(stringList);
Long[]   l = arrayListToArray(longList);
Ali Bagheri
sumber
1
Bagaimana jika kita memiliki ArrayList <Animal> dan itu berisi jenis Anjing dan Kucing yang memperpanjang Hewan? Sepertinya itu akan gagal jika elemen pertama adalah Anjing dan selanjutnya adalah Kucing. Ia melihat elemen pertama, menciptakan array bertipe Anjing, menambahkan anjing kemudian mencoba menambahkan kucing dan gagal. Juga mungkin tidak bekerja dengan E.
ptoinson