2010-12-13 10 views
2

警告の質問なしでtoArray()を行う方法はもう1つありますが、ここに掲載されているほとんどのものとは異なります。List <GenericClass <T>> .toArray()内の警告を取り除く

メソッド実装を書き換えて(メソッドのシグネチャを変更せずに)、警告なしでコンパイルできるようにするにはどうすればよいですか?

明らかに難しいのは、Tのクラス情報が実行時に利用できないということです。しかし、戻り値の型は実行時にも消去された型なので、実行できないという理由はありません。ですから、コンパイル時の型の安全を守るためにはどうすればいいですか?

はあなたがすることはできません

<T> GenericClass<T>[] toGenericArray(List<GenericClass<T>> list) { 
    return list.toArray(new GenericClass[0]); 
} 
+0

なぜJavaがstupid = Pであるかの完全な例 – Falmarri

+6

@Falmarri:もっと正確に言えば、Javaの中で愚かなものの例です。それはかなり正しく、いくつかのことが間違っています。私は消去がばかだと同意するが、これを一般化するのは不公平だ。 –

答えて

1

ありがとうございます。配列は共変であるため、パラメータ化された型を保持する配列に対してコンパイル時の安全性を持たせることは不可能です。

これは常に、法的になります(?。あなたは<を使用しない限り>法的です):

GenericClass<String>[] array = new GenericClass[1]; 
Object[] brokenArray = array; 
brokenArray[0] = new GenericClass<Integer>(); 
String value = array[0].getGenericValue(); //kaboom 

コンパイラは、そこからあなたを守ることができないので、/承認警告があることを抑制するためにあなたを強制的に。

+0

+1は、Javaの配列が共変であることを示します。実際、(私のフォローアップの質問を参照してください)。とにかく/警告が表示されたジェネリックアレイを(直接的または間接的に)作成できるケースはありますか?そうはならないでしょう、そうですか?実際には、「間違った」行にClassCastExceptionを生成する全く法的なコードを作成することは常に可能です。 – RAY

1

@SuppressWarnings("unchecked")注釈を追加できます。これはメソッドのシグネチャを変更するものではなく、警告を生成せずに「安全でない」ことを行うことができます。あなたのコードは本当に安全です。だから、警告を抑止しても問題ありません。 @ Affeの答えでは、あなたが帰った後に悪いことが起こるかもしれませんが、確かにあなたのメソッドを正しく実装することができます。

Javaコレクションフレームワークは内部的にこのような種類の処理を行うため、ハックだけではありません。さて、それはハックですが、それはOKのハックです。まあ、それではないですが、それは動作します。キンダー。

関連する問題