6

ジェネリックは Java 5 でのコンパイル時にのみチェックされるため、すべての状況で ClassCastExceptions を回避できますか?

4

4 に答える 4

16

Java 5 ジェネリックが提供する「鉄の」保証は、コンパイルで「チェックされていない」警告が生成されない 限り、コンパイラによって挿入されたキャストから ClassCastException が発生しないことです。

実生活では、コードがレガシー (非汎用) ライブラリを使用している場合、チェックされていない警告を避けることができないことがよくあります。次に、コンパイラによって生成されたキャストがClassCastException をスローする可能性があります。これを防ぐのは、ライブラリ コードによって返される値が宣言に対して適切に型指定されていることを確認することです。

それ以外の場合、状況は変わりません。ジェネリックの外では、互換性のない型にキャストすると、いつもと同じように ClassCastException が発生します。

(これおよびその他のジェネリックに関する質問の参考としては、Java Generics and Collectionsを参照してください。)

于 2009-08-14T11:10:58.030 に答える
12

まず第一に、コードが未キャッシュの警告なしでコンパイルされることを確認する必要があります。それは良い指標です。その理由を理解するには、Effective Java のジェネリックのサンプルの章を参照することをお勧めします。

第二に、ジェネリックは次のようなコードからあなたを守ることはできません:

public void methodOne(Integer argument)  {
     methodTwo(argument);
} 

public void methodTwo(Object argument) {
     System.out.println(((Date) argument).getTime());
}

第 3 に、何らかの方法でクラス ローダーをいじっていると、このディスカッション スレッドClassCastExceptionsのように、おかしくなる可能性があります。見るのは気が遠くなる

java.lang.ClassCastException: javax.mail.Session を javax.mail.Session にキャストできません

したがって、答えはノーです。ジェネリックを適切に使用するだけでは、 s を取り除くことはできませんClassCastException

于 2009-08-14T11:09:48.220 に答える
2

いいえ。Java 5.0 とジェネリック型を使用しても、ClassCastException に対応できるわけではありません。

于 2009-08-14T11:00:22.077 に答える
-1

いいえ。ジェネリックは、ランタイム例外ではなく、コンパイル時のエラーからのみあなたを救います。

于 2009-08-14T11:58:45.577 に答える