4

レガシーコードをリファクタリングしてジェネリックスで作業を開始した後、次のような関数が見つかりました。

T[] splitXXX() {
   //blah blah
}

jdkはジェネリック型の配列を実際にはサポートしていないため、クラスキャストの例外を大量に生成します。そして、私は疑問に思います-なぜこのコードはJavaできれいにコンパイルされるのですか?下位互換性と関係がありますか?(実行時ではなくコンパイル時にこのエラーを見つけることができれば、調査時間を大幅に節約できたでしょう)。私は何が欠けていますか?

4

2 に答える 2

0

できないからといっnew T[...]て、型の変数を持てないという意味ではありませんT[]。同じように、できないからといっnew T()て、型の変数を持てないというわけではありませんT

以下を返すメソッドを持つ正しいコードを持つことは完全に可能ですT[]

class Something<T> {
    T[] foo;
    Something(T[] in) { foo = in; }
    T[] splitXXX() { return foo; }
}

クラスキャストの例外をたくさん生み出し、

まあ、それが例外を生成する場合、それはあなたが何か間違ったことをしていることを意味します。どのコードが例外などを生成しているのかを示していませんが、コードで無効なキャストを行っている可能性があります。

于 2012-12-05T03:51:02.890 に答える
0

型変数が戻り値の型だけに現れると、かなり危険です。例えば

public static <T> T foo(){ ... }

// usage
String s = foo();
Integer i = foo();

コンパイラーは、プログラマーが に代入Tする場合String、おそらく自分が何をしているのかを知っているので、それを推測するのはかなり安全だと考えT=Stringます。実際には制限はまったくなく、結果はfoo()どのタイプにも割り当てることができます。

しかし、プログラマーは自分が何をしているのかを常に知っているとは限りません。彼は、誤ってコミットする可能性のある入力ミスを検出するために、厳密に型指定されたコンパイラに依存しています。

于 2012-12-04T18:49:32.393 に答える