Java のジェネリックスはすべての ClassCastExceptins を回避しますか?
-
16-09-2019 - |
質問
ジェネリックはJava 5でのコンパイル時間中にのみチェックされるため、すべての状況でClassCastExceptionsを避けることができますか?
解決
まず最初に、警告が表示されずにコードがコンパイルされることを確認する必要があります。それは良い指標です。その理由を理解するには、以下を参照することをお勧めします。 Effects Java のジェネリックスのサンプル章.
次に、ジェネリックでは次のようなコードから身を守ることはできません。
public void methodOne(Integer argument) {
methodTwo(argument);
}
public void methodTwo(Object argument) {
System.out.println(((Date) argument).getTime());
}
第三に、何らかの方法でクラスローダーをいじっていると、奇妙になる可能性があります。 ClassCastExceptions
, 、など このディスカッションスレッド. 。見るのは気が遠くなる
java.lang.ClassCastException:javax.mail.sessionはjavax.mail.sessionにキャストすることはできません
したがって、答えは次のとおりです いいえ、取り除くことはできません ClassCastException
ジェネリックを適切に使用するだけで.
他のヒント
Java 5のジェネリック医薬品が提供する「鋳鉄製の」保証はあなたがの提供コンパイラによって挿入されたキャストからのClassCastExceptionを見ることはありませんということです。のそのコンパイルには、「未チェック」の警告を生成しませんでした。
あなたのコードは、レガシー(非総称化)のライブラリを使用している場合は、現実の生活の中で、あなたは多くの場合、未チェックの警告を回避することはできません。その後、コンパイラで生成されたキャストのことができますのClassCastExceptionがスロー、そしてそれは、ライブラリのコードで返される値は、あなたの宣言のためによく型付けされていることを確実にすることによって、これを防ぐためにあなたの仕事です。
そうでなければ、状況は変わりません。ジェネリック医薬品の外あなたは互換性のない型にキャストする場合は、ClassCastExceptionがあなたがいつもやったのと同じ方法で取得します。
(これと他のジェネリック医薬品の質問のための適切な参照は、 Javaのジェネリックとコレクションのです。)
はありません。 Javaの5.0とジェネリックタイプを使用するとClassCastExceptionがプルーフことはありません。
いいえ。ジェネリック医薬品は、唯一の例外は、実行時ではない、コンパイル時のエラーからあなたを救うます。