美文网首页
泛型擦除

泛型擦除

作者: 嘟嘟赌起 | 来源:发表于2018-03-23 16:47 被阅读0次

    示例代码

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

    public class myClass {
    
        private static List<String> 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 泛型,你了解类型擦除吗?

    相关文章

      网友评论

          本文标题:泛型擦除

          本文链接:https://www.haomeiwen.com/subject/zbsxcftx.html