6

次のMCVEを検討してください。

public class MyClass {
    private LinkedList<Foo> myList = new LinkedList<Foo>();

    // Some irrevelant stuff which includes loading myList

    public void myMethod() {
        LinkedList<Foo> newList;

        try {
             newList = (LinkedList<Foo>) myList.clone();
        } catch (ClassCastException e) {
             // do something in case java screws up
        }
    }
}

を使用して警告を取り除くことができることは知っていますが、ブロック@SuppressWarnings("unchecked")が機能しないのはなぜですか? try/catchそこに入れるのは時間とエネルギーの無駄try/catchですか?

4

3 に答える 3

10

これは ClassCastException を取得していないため、機能しません。

リストの消去されたタイプは、実行時にチェックできません。

List から何かを取得しようとすると ClassCastException が発生することがありますが (それが Foo ではないことが判明します)、List 自体は単なる LinkedList です (その要素の型が何であるかを知らずに)。

のインスタンスは、実行時のLinkedList<Foo>とまったく同じように見えます。LinkedList<Bar>

警告の理由は、実行中のキャストが正しいことをランタイム システムが保証できないためです (LinkedList 部分はチェックできますが、ジェネリック型はチェックできません)。

于 2012-10-23T12:12:34.277 に答える
0

何かを明示的にキャストしている場合、コンパイラはチェックされていない例外をチェックしないと思います。コンパイラは、明示的な型キャストをコード ライターに依存しています。

于 2012-10-23T12:13:01.803 に答える