泛型和ClassCastException

Fra*_*e91 3 java generics

鉴于以下代码:

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?

Lou*_*man 6

由于泛型在语言中的实现方式,您的演员(T)实际上并没有做任何事情.只有当你以一种实际输出具体类型的方式使用泛型类型时 - 这里,System.out.println期望a String和它执行转换才能得到它 - 运行时实际上会进行任何转换.

就Java运行时而言,a GenericHolder<String>和a 之间没有区别GenericHolder<Integer>; 他们都持有Object.Java只是在从泛型类型中获取具体类型的任何位置插入强制转换.

研究类型擦除更多细节.

  • 正确,因为就构造函数而言,对"T"的强制转换没有任何作用; `T`基本上总是`Object`. (2认同)