0

toArray(T [])コレクションの値を保持できる配列を割り当てて、それをこのコレクションのメソッドに渡す必要があるのはなぜですか? toArray()事前に割り当てられた配列を必要としないメソッドがあることは知っていますが、このメソッドは絶対に悪い Object[] を返します。また、型キャストは避けたいと思います。

例:

Set<String> strings = new HashSet<>();
// put some values in it
String[] stringArr = strings.toArray(/* preallocated array, why? */);

私がジェネリックを使用していると仮定すると(それ以外はすべて悪い習慣です)、使用されるコレクションクラスには、この仕事をするのに十分な情報が必要です。次のようなことができます。

public someCollection<T> {
...
    public T[] toArray() {
        T[] arr = new T[this.length];
        // fill the array with the collection values
        return arr;
    }
}

キャッチはどこにありますか。間違っていなければ、デフォルトのコレクション クラスに簡単に実装できるはずです。

4

3 に答える 3

4

Javaジェネリックは型消去を使用します。つまり、型パラメーターはコンパイル時にのみ存在します

実行時には、コードは何が何でTあるかわからないため、new T[].

于 2013-11-08T13:46:22.617 に答える
1

コレクションの値を保持できる配列を割り当てて、それをこのコレクションの toArray(T []) メソッドに渡す必要があるのはなぜですか?

そうではありません。必要に応じてそうすることができますが、同様に空の配列を渡すこともできます。したがって、ドキュメントには次のように記載されています。

コレクションが指定された配列に収まる場合は、そこに返されます。それ以外の場合は、指定された配列の実行時の型とこのコレクションのサイズで新しい配列が割り当てられます。

ただし、必要に応じて、配列の実行時の型を使用して同じ型の別の配列を作成するため、何かを渡す必要があります。を使用new T[...]すると、型が消去されるため、正しい実行時の型の配列が作成されません。詳細については、Java ジェネリックに関する FAQを参照してください。具体的には、具体的なパラメーター化された型の配列に関するセクションを参照してください。

于 2013-11-08T13:47:30.893 に答える