神奇的泛型擦除

什么是泛型擦除
我们都知道在使用集合的时候,需要指定集合中元素的类型。这就是我们所说的泛型。
例如 :List ls = new ArrayList<>();

本文主要讲的是泛型擦除。在讲解之前,我们先看段代码

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException {
   
       //加载一个类
        Class<List> listClass = (Class<List>) Class.forName
                ("java.util.List");
        //创建一个集合对象
        List<String> lst = new ArrayList<>();
        // 集合中添加一个元素
        lst.add("String001");
        // 反射获取集合 的add方法
        Method add = listClass.getDeclaredMethod("add", Object.class);
        // 调用add方法向集合中添加一个Object对象
        add.invoke(lst, new Object());
        // 输出集合
        System.out.println(lst);
    }

我们先思考下,这个代码能否正常的执行。因为我们知道我们所定义的集合的泛型是String类型的。但是我们向其中添加了一个Object类型的对象。
接下来我们看看执行的结果:

D:\jdk1.8\bin\java.exe "-javaagent:F:\tool\IntelliJ IDEA Community Edition 2019.3.3\lib\idea_rt.jar=54223:F:\tool\IntelliJ IDEA Community Edition 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath D:\jdk1.8\jre\lib\charsets.jar;D:\jdk1.8\jre\lib\deploy.jar;D:\jdk1.8\jre\lib\ext\access-bridge-64.jar;D:\jdk1.8\jre\lib\ext\cldrdata.jar;D:\jdk1.8\jre\lib\ext\dnsns.jar;D:\jdk1.8\jre\lib\ext\jaccess.jar;D:\jdk1.8\jre\lib\ext\jfxrt.jar;D:\jdk1.8\jre\lib\ext\localedata.jar;D:\jdk1.8\jre\lib\ext\nashorn.jar;D:\jdk1.8\jre\lib\ext\sunec.jar;D:\jdk1.8\jre\lib\ext\sunjce_provider.jar;D:\jdk1.8\jre\lib\ext\sunmscapi.jar;D:\jdk1.8\jre\lib\ext\sunpkcs11.jar;D:\jdk1.8\jre\lib\ext\zipfs.jar;D:\jdk1.8\jre\lib\javaws.jar;D:\jdk1.8\jre\lib\jce.jar;D:\jdk1.8\jre\lib\jfr.jar;D:\jdk1.8\jre\lib\jfxswt.jar;D:\jdk1.8\jre\lib\jsse.jar;D:\jdk1.8\jre\lib\management-agent.jar;D:\jdk1.8\jre\lib\plugin.jar;D:\jdk1.8\jre\lib\resources.jar;D:\jdk1.8\jre\lib\rt.jar;F:\workspace\springbootdubbodemo\service\target\classes;D:\java\localrepo\org\springframework\boot\spring-boot-starter-web\2.0.0.RELEASE\spring-boot-starter-web-2.0.0.RELEASE.jar;D:\java\localrepo\org\springframework\boot\spring-boot-starter\2.0.0.RELEASE\spring-boot-starter-2.0.0.RELEASE.jar;D:\java\localrepo\org\springframework\boot\spring-boot-starter-logging\2.0.0.RELEASE\spring-boot-starter-logging-2.0.0.RELEASE.jar;D:\java\localrepo\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\java\localrepo\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\java\localrepo\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;D:\java\localrepo\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;D:\java\localrepo\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\java\localrepo\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;D:\java\localrepo\org\springframework\boot\spring-boot-starter-json\2.0.0.RELEASE\spring-boot-starter-json-2.0.0.RELEASE.jar;D:\java\localrepo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.4\jackson-datatype-jdk8-2.9.4.jar;D:\java\localrepo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.4\jackson-datatype-jsr310-2.9.4.jar;D:\java\localrepo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.4\jackson-module-parameter-names-2.9.4.jar;D:\java\localrepo\org\springframework\boot\spring-boot-starter-tomcat\2.0.0.RELEASE\spring-boot-starter-tomcat-2.0.0.RELEASE.jar;D:\java\localrepo\org\apache\tomcat\embed\tomcat-embed-core\8.5.28\tomcat-embed-core-8.5.28.jar;D:\java\localrepo\org\apache\tomcat\embed\tomcat-embed-el\8.5.28\tomcat-embed-el-8.5.28.jar;D:\java\localrepo\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.28\tomcat-embed-websocket-8.5.28.jar;D:\java\localrepo\org\hibernate\validator\hibernate-validator\6.0.7.Final\hibernate-validator-6.0.7.Final.jar;D:\java\localrepo\javax\validation\validation-api\2.0.1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值