3

警告の質問なしで toArray() を行う方法の別の1つですが、ここに投稿されたほとんどのものとは異なります。

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

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

ありがとうございました

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

2 に答える 2

2

できません。配列は共変であるため、パラメーター化された型を保持している配列に対してコンパイル時の安全性を確保することは不可能です。(正当な < ? > を使用しない限り。)

これは常に合法です:

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

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

于 2010-12-13T23:28:32.263 に答える
1

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

Java Collections フレームワークはこの種の処理を内部で行うため、単なるハックではありません。まあ、それハックですが、OK ハックです。まあ、それは大丈夫ではありませんが、うまくいきます。ちょっと。

于 2010-12-13T23:33:16.617 に答える