这是我遇到的一个案例的缩小示例。
看看下面的代码:
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
}
}
让我感到震惊的是,不可避免的东西ClassCastException
被扔在第 19 行而不是第 18 行!
因此,在你的代码中有一个类型的对象Holder<String>
并不足以保证它getValue
会返回一个String
. 您还必须检查这个对象是如何构造的!
我知道 Type Erasure 在这里发挥了作用,但我不确定上述内容的含义有多大。在我的特殊情况下,newHolder
-corresponding 方法在外部库中定义并返回java.lang.Object
,因此我必须进行这些转换。