Collection<E>.toArray()
(パラメータ化されていないメソッド) が を返すのはなぜObject[]
ですか?
それは意識的に下された決定の1つですか?toArray()
必要に応じて、メソッドが を返すことができない理由はありますE[]
か?
Collection<E>.toArray()
(パラメータ化されていないメソッド) が を返すのはなぜObject[]
ですか?
それは意識的に下された決定の1つですか?toArray()
必要に応じて、メソッドが を返すことができない理由はありますE[]
か?
これは、 type の配列が typeT
を知らずにインスタンス化できないためClass<T>
です。これをtoArray(T[] array)
、次のソースを持つ と比較してください ( の例LinkedList
)。渡された配列は、可能なコンテナーとして使用されるだけでなく、その型の新しい配列をインスタンス化するためにも使用されることに注意してください。T
が のスーパークラスでない場合、このコードは例外をスローしますE
。オブジェクトを配列に追加できない場合。
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), size);
int i = 0;
Object[] result = a;
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item;
if (a.length > size)
a[size] = null;
return a;
}
配列コンテナには、実行時に保持されるアイテムデータ型が関連付けられています。Object配列を作成してから文字列を追加すると、このオブジェクトはString[]にキャストできなくなります。
Object[] objArr = new Object[] {"a", "b"};
String[] strArr = (String[]) objArr; //Produces ClassCastException
また、誤ったタイプのアイテムを配列に追加すると、実行時にこの配列プロパティがどのように使用されるかを確認できます。
String[] strArr = new String[] {"a", "b"};
Object[] objArr = (Object[]) strArr; //Legal this time
objArr[0] = 15; //Produces ArrayStoreException
ジェネリック型の引数は実行時に消去されるため、toArray()を呼び出したときに、JVMは実行時に作成する特定の配列型を認識しません。