这是我遇到的一个案例的缩小示例。
看看下面的代码:
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,因此我必须进行这些转换。