鉴于以下代码:
public class ClassCastTest {
private static class GenericHolder<T> {
private T object;
public GenericHolder(Object object) {
this.object = (T) object;
System.out.println(getObject());
}
public T getObject() {
return object;
}
}
public static void main(String[] args) {
GenericHolder<String> foo = new GenericHolder<>(3l);
System.out.println(foo.getObject());
}
}
Run Code Online (Sandbox Code Playgroud)
为什么Java在main方法的第二行而不是GenericHolder的第二行抛出ClassCastException?
由于泛型在语言中的实现方式,您的演员(T)实际上并没有做任何事情.只有当你以一种实际输出具体类型的方式使用泛型类型时 - 这里,System.out.println期望a String和它执行转换才能得到它 - 运行时实际上会进行任何转换.
就Java运行时而言,a GenericHolder<String>和a 之间没有区别GenericHolder<Integer>; 他们都持有Object.Java只是在从泛型类型中获取具体类型的任何位置插入强制转换.
研究类型擦除更多细节.