2

Collection<E>.toArray()(パラメータ化されていないメソッド) が を返すのはなぜObject[]ですか?

それは意識的に下された決定の1つですか?toArray()必要に応じて、メソッドが を返すことができない理由はありますE[]か?

4

3 に答える 3

6

これは、 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;
}
于 2013-02-23T07:26:26.650 に答える
0

配列コンテナには、実行時に保持されるアイテムデータ型が関連付けられています。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は実行時に作成する特定の配列型を認識しません。

于 2013-02-23T07:36:10.637 に答える