2008-09-16 3 views
18

は、Collectionインタフェースは次のメソッド宣言します実行時に配列型を指定してJava配列をインスタンス化する方法は? Javaコレクションフレームワークで

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

は、このコレクション内のすべての要素を含む配列を返します。返される配列の実行時の型は、指定された配列の実行時の型です。コレクションが指定された配列に収まる場合は、コレクションがそこに戻されます。そうでない場合は、指定された配列の実行時の型とこのコレクションのサイズで新しい配列が割り当てられます。

あなたは、このメソッドを実装したい場合は、どのように実行時にのみ知られている、のタイプの配列を作成しますか?

ArrayListには、それをしない方法を見て、

答えて

32

は、その使用上のチュートリアルでは、ここで見つけることができ

java.lang.reflect.Array.newInstance(Class<?> componentType, int length) 

静的メソッドを使用しますジェネリック型の新しい配列を作成します(実行時にのみ認識されます)。配列を作成する必要があります単純にジェネリック型にキャストしてそのまま使用してください。これはJavaのジェネリック実装(イレーズ)の制限です。

この関数は、与えられた配列(a)を使用して(それを事前にチェックして)、新しい配列を作成します。

3
Array.newInstance(Class componentType, int length) 
-1

へ:

public <T> T[] toArray(T[] a) { 
    if (a.length < size) 
     a = (T[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size); 
    System.arraycopy(elementData, 0, a, 0, size); 
    if (a.length > size) 
     a[size] = null; 
    return a; 
} 
+3

ここでの他の回答とは異なり、この方法ではTの配列は作成されません。消去のためにT []に割り当てることができますが、必ずしもそのようにはなりません。特定のインスタンスでTがStringであり、そこに作成した配列がString [](キャストは不要)に割り当てられている場合は、予期しないClassCastExceptionが発生します。これは型汚染の例です。しないでください! –

関連する問題