3

これは私が遭遇したケースの絞り込み例です。

以下のコードを見てください。

class Holder<T> {
    private T t;
    public Holder(T t) {
        this.t = t;
    }
    public T getValue() {
        return t;
    }
}

public class FooMain {

    private static Object newHolder() {
        return new Holder<Integer>(3);
    }

    public static void main(String args[]) {
        Holder<String> hs = (Holder<String>) newHolder(); // line-18
        String s = hs.getValue();                         // line-19
    }
}

私を驚かせたのは、避けられないことがline-18ではなくline-19ClassCastExceptionでスローされることです!

したがって、型のオブジェクトをコード内に持つだけでは、が を返すことHolder<String>を保証するには不十分です。また、このオブジェクトがどのように構築されたかを調べる必要があります!getValueString

Type Erasure がここで役割を果たすことは理解していますが、上記の影響がどれほど広いかはわかりません。私の特定のケースでは、newHolder対応するメソッドが外部ライブラリで定義されて返さjava.lang.Objectれるため、これらのキャストを行う必要があります。

4

2 に答える 2

2

ジェネリックは、型の安全性をチェックするためのコンパイル時のツールです。実行時には、タイプ erasureの検証はありません。そのため、整数から文字列を取得するとエラーが発生します。

ところで、キャスト時に警告が表示されるはずです。警告を無視すると、結果が生じる可能性があります...

于 2013-06-03T13:51:53.547 に答える