2013-10-15 8 views
5

List.toArray()が一般的でないのはなぜですか?なぜ型を引数として与えなければならないのですか(そして通常は新しい空のインスタンスを作成する必要があります)? なぜList.toArray()は一般的ではありませんか?

public Object[] toArray() 

http://docs.oracle.com/javase/7/docs/api/java/util/List.html#toArray()


アップデート:私は、一般的な配列の作成が許可されていないことを学んだので、持っているが、私はそれがあるべきと考えています。それが許されない理由はありますか?

Main.java:28: error: generic array creation 
     T[] ret = new T[size()]; 

http://ideone.com/3nX0cz


更新:[OK]を私はこれが答えであると信じて:

http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays

ない、それは直接関係はなく、間接的に関連性があるからです。 MyList<String>new String[size()]になりますが、T自体がパラメータ化されたタイプである可能性があります。new T[size()]には本質的に間違ったものはありません。したがって、MyList<Set<Integer>>を作成する場合、TSet<Integer>と等しくなり、コンパイラはnew Set<Integer>[size()]を作成しようとします。この場合、返されたときにリンクに問題が発生する可能性があります。誰かがこれらの行に沿って答えを出そうとしましたが、その回答は削除されていたので、私はそれが誰かを忘れてしまいました。

+4

オーバーレイされたバージョンのtoArrayは、汎用の –

+0

より少し下にスクロールします。 – SLaks

+0

@ Dgrin91しかし、配列としてインスタンスをパラメータとして渡す必要があります。これはOPが要求していたものです。 – ajb

答えて

0

Javaのジェネリックスの性質のためです。消去のため、実行時に利用できる型情報がないため、引数なしバージョンはオブジェクトの配列だけを返すことができます。

+0

@GriffeyDog Kayamanが言っているTパラメータを追加しない限り、戻り値の型を変更できませんでした。オリジナルの 'toArray()'が1.2以降にあったので、下位互換性を維持するためにオーバーロードを作成したことは間違いありません。 –

4

このメソッドは、新しい配列を作成することになっています。しかし、Classの情報がTでない場合は、それを行うことはできません。

あなたは(他の方法のように)パラメータとして配列を渡す場合は問題がないT[] array = new T[list.size()];

を言うことはできません。

1

toArray()の実装ではT[]配列を構築できないため、 "exemplar"配列がないと返されるはずです。その違いを確認するにはtoArray(T[])の汎用オーバーロードのソースコードをAbstractCollectionに見てください。

また、彼らはClass<T>引数でそれを実行できました。しかし、少なくとも模範的な場合は、必要に応じてスペースを自分で割り当てることができます(ジェネリックタイプG<S>の場合はClass< G<S> >のインスタンスを生成することはほとんど不可能です)。

関連する問題