làm cho ArrayList.toArray () trả về các kiểu cụ thể hơn


189

Vì vậy, thông thường ArrayList.toArray()sẽ trả về một loại Object[].... nhưng được cho là một Arraylistđối tượng Custom, làm thế nào để tôi toArray()trả về một loại Custom[]chứ không phải Object[]?


1
Có 2 phương thức có cùng tên 'toArray ()' trong ArrayList. Bắt đầu từ 1.5, phương thức thứ hai lấy mảng gõ. Bạn đang tìm kiếm giải pháp cho trước 1.5?
Ritesh

Câu trả lời:


308

Như thế này:

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

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

Trước Java6, bạn nên viết:

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

bởi vì việc triển khai nội bộ sẽ phân bổ lại một mảng có kích thước phù hợp để bạn có thể thực hiện trước nó tốt hơn. Vì Java6, mảng trống được ưa thích, xem .toArray (new MyClass [0]) hoặc .toArray (new MyClass [myList.size ()])?

Nếu danh sách của bạn không được gõ đúng, bạn cần thực hiện phân vai trước khi gọi tớiArray. Như thế này:

    List l = new ArrayList<String>();

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

1
AFAIK: Điều này có liên quan đến Java nói chung, không thể sử dụng các hàm tạo chung. Vì vậy, trong khi nó biết bạn cần nó để chuyển đổi cho bạn một đối tượng như String [] hoặc MyObject [], thì nó không thể tự khởi tạo nó.

Điều gì xảy ra nếu thay vì String chúng ta muốn sử dụng gấp đôi? Nó dường như thất bại ... Chúng ta có thể sử dụng Double, nhưng nếu tôi muốn nhân đôi thì sao?
Pixel

2
@pbs Bạn không thể. Tổng quát của Java chỉ hỗ trợ các kiểu tham chiếu, không phải kiểu nguyên thủy. Mặc dù vậy, phần tự động đấm bốc / unboxing sẽ cho phép bạn bỏ qua sự khác biệt giữa chúng.
solarshado

16

Nó không thực sự cần phải quay lại Object[], ví dụ: -

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

Đây là Customlớp học của tôi : -

public class Custom {
    private int i;

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

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


1

Tôi đã có câu trả lời ... điều này dường như đang hoạt động rất tốt

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

Mẫu:

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

1
Điều gì xảy ra nếu chúng ta có ArrayList <Animal> và nó chứa các loại Dog và Cat mở rộng Animal? Có vẻ như nó sẽ thất bại nếu yếu tố đầu tiên là Dog và tiếp theo là Cat. Nó nhìn thấy phần tử đầu tiên, tạo ra một mảng kiểu Dog, thêm chú chó sau đó cố gắng thêm con mèo và thất bại. Cũng có thể không hoạt động với E.
ptoinson chung
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.