arrayList.toArray()がより具体的な型を返すようにする


189

したがって、通常ArrayList.toArray()Object[]...のタイプを返しますが、それ ArraylistがオブジェクトのタイプであるCustomとするtoArray()と、Custom[]ではなくのタイプを返すようにするにはどうすればよいObject[]ですか?


1
ArrayListには同じ名前の「toArray()」を持つ2つのメソッドがあります。1.5から、2番目のメソッドは型指定された配列を取ります。1.5より前のソリューションをお探しですか?
リテッシュ

回答:


308

このような:

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

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

Java6以前は、次のように書くことが推奨されていました。

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

内部実装はとにかく適切なサイズの配列を再割り当てするので、前もってそれを行うほうがよいためです。Java6では空の配列が推奨されるため、.toArray(new MyClass [0])または.toArray(new MyClass [myList.size()])を参照してください。

リストが正しく入力されていない場合は、toArrayを呼び出す前にキャストを行う必要があります。このような:

    List l = new ArrayList<String>();

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

1
AFAIK:これは、全体としてJavaと関係があるため、汎用コンストラクターを使用できません。そのため、String []やMyObject []のようなオブジェクトを変換する必要があることはわかっていますが、それ自体でインスタンス化することはできません。

Stringの代わりにdoubleを使用したい場合はどうなりますか?失敗したようです... Doubleを使用できますが、Doubleが必要な場合はどうなりますか?
Pixel

2
@pbsできません。Javaのジェネリックは、プリミティブではなく参照型のみをサポートします。ただし、自動ボックス化/ボックス化解除では、ほとんどの場合、それらの違いを無視できます。
solarshado 2015年

16

Object[]たとえば、実際に返す必要はありません。

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

これが私のCustomクラスです:-

public class Custom {
    private int i;

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

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


1

私は答えを得ました...これは完全にうまく機能しているようです

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

サンプル:

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

1
ArrayList <Animal>があり、Animalを拡張するDogおよびCatタイプが含まれている場合はどうなりますか?最初の要素がDogで、次の要素がCatの場合、失敗するようです。最初の要素を見て、Dog型の配列を作成し、dogを追加してから、catを追加しようとして失敗します。また、一般的なE.では動作しないかもしれません
ptoinson
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.