1

ArrayListジェネリック型の をジェネリック型の配列(同じジェネリック型)に変換したい。たとえば、私は を持っていてArrayList<MyGeneric<TheType>>、取得したいと考えていMyGeneric<TheType>[]ます。

toArrayメソッドとキャストを使用してみました:

(MyGeneric<TheType>[]) theArrayList.toArray()

しかし、これはうまくいきません。私の他のオプションは、配列を作成しMyGeneric<TheType>、arraylist の要素を 1 つずつ挿入して、それらを正しい型にキャストすることです。しかし、この配列を作成しようとしたことはすべて失敗しました。

使用する必要があることはわかっていますArray.newInstance(theClass, theSize)が、のクラスを取得するにはどうすればよいMyGeneric<TheType>ですか? これを使用して:

Class<MyGeneric<TheType>> test = (new MyGeneric<TheType>()).getClass();

動作しません。IDE は、Class<MyGeneric<TheType>>Class<? extends MyGeneric>は互換性のない型であると述べています。

これを行う:

    Class<? extends MyGeneric> test = (new MyGeneric<TheType>()).getClass();

    MyGeneric[] data = (MyGeneric[]) Array.newInstance(test, theSize);

    for (int i=0; i < theSize; i++) {
        data[i] = theArrayList.get(i);
    }
    return data;

ClassCastExceptionの行でaを上げdata[i] = ...ます。

私は何をすべきか?

ノート:

サードパーティのライブラリで使用する必要があるため、配列が必要なので、「ここにコレクションの名前を挿入する」というオプションはありません。

4

1 に答える 1

3

最初にタイプの配列を作成してから、次を呼び出す必要があります。

<T> T[]   toArray(T[] a)

このリスト内のすべての要素を適切な順序で (最初の要素から最後の要素まで) 含む配列を返します。返される配列の実行時型は、指定された配列のものです。

仕様を読む: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray(T[])

配列がリストより短い場合、新しい配列が割り当てられ、メソッドによって返されます。配列がリストよりも長い場合、配列内の残りの項目は null に設定されます。

- - - - - - 例 - - - - -

ArrayList<MyGeneric<TheType>> list;
//......
MyGeneric<TheType>[] returnedArray = new MyGeneric[list.size()]; // You can't create a generic array. A warning for an error. Don't mind, you can suppress it or just ignore it.
returnedArray = list.toArray(returnedArray); // Cong! You got the MyGeneric<TheType>[] array with all the elements in the list.
于 2013-01-27T09:53:14.817 に答える