什么是泛型擦除
我们都知道在使用集合的时候,需要指定集合中元素的类型。这就是我们所说的泛型。
例如 :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