美文网首页
泛型擦除

泛型擦除

作者: 嘟嘟赌起 | 来源:发表于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 泛型,你了解类型擦除吗?

相关文章

  • 【进阶之路】Java的类型擦除式泛型

    【进阶之路】Java的类型擦除式泛型 Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Jav...

  • 泛型

    泛型用于编译时期,确保类型的安全 在运行时,会将泛型去掉,class文件是不带泛型的,这个称为泛型的擦除,擦除是为...

  • java泛型

    java的泛型是"伪泛型",为什么这么说。因为泛型只是作用在编译之前,编译之后,泛型都被擦除了(类型擦除)。所以说...

  • Android 开发也要掌握的Java知识 - Java泛型

    如果需要看泛型擦除Java泛型擦除 1.Java泛型有什么用?为啥要使用泛型? Java中数组的类型是定义的时候就...

  • JAVA泛型和类型擦除

    什么是类型擦除 Java是使用擦除来实现泛型的。使用泛型后在运行时任何具体的类型信息都被擦除了,关于泛型的处理都是...

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • Kotlin语言(六):泛型

    1、泛型类 2、泛型函数 3、泛型上限 4、泛型擦除 5、泛型投射 6、星号投射

  • Java如何在运行时获取泛型的类型

    Java泛型是伪泛型,会在编译完成时进行类型的擦除,我们无法在运行时获取泛型参数的具体类型(类型擦除会被替换成泛型...

  • 15 泛型

    1.泛型类 2.泛型方法 3.擦除

  • Android面试题知识点积累(四)

    泛型中类型擦除是什么 泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,专业术语叫做...

网友评论

      本文标题:泛型擦除

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