これは私が遭遇したケースの絞り込み例です。
以下のコードを見てください。
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>
を保証するには不十分です。また、このオブジェクトがどのように構築されたかを調べる必要があります!getValue
String
Type Erasure がここで役割を果たすことは理解していますが、上記の影響がどれほど広いかはわかりません。私の特定のケースでは、newHolder
対応するメソッドが外部ライブラリで定義されて返さjava.lang.Object
れるため、これらのキャストを行う必要があります。