泛型擦除

示例代码

前几天遇到这块的编译问题,查了一下,泛型这个东西,是可以擦除的...
代码如下:

public class myClass {

    private static List list;
    
    public static void main(String[] args) {
        list = new ArrayList<>();
        list.add("abc");
//        list.add(123);
        try {
            Method declaredMethod = list.getClass().getDeclaredMethod("add", Object.class);
            declaredMethod.invoke(list, 123);
            System.out.print(list);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

执行结果是:

[abc, 123]

为什么能擦除

Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。

Java的泛型是伪泛型,在设计之初,就是设计成了编译期间,所有的泛型信息都会被擦除掉。具体详细请参考Java不能实现真正泛型的原因?这篇文章,简单总结就是:

泛型是在JDK1.5出现时,当时JDK1.4已经在很多项目中使用,为了保证向前兼容,泛型不能像C语言那样,实现真正的泛型,所以做成了伪泛型。

其他相关扩展引用:
泛型的内部原理:类型擦除以及类型擦除带来的问题
Java 泛型,你了解类型擦除吗?

你可能感兴趣的:(泛型擦除)