7.新特性-泛型-深入理解
泛型中类型擦除泛型这个特性是从JDK 1.5才开始加入的因此为了兼容之前的版本Java泛型的实现采取了“伪泛型”的策略即Java在语法上支持泛型但是在编译阶段会进行所谓的“类型擦除”Type Erasure将所有的泛型表示尖括号中的内容都替换为具体的类型其对应的原生态类型就像完全没有泛型一样。泛型的类型擦除原则消除类型参数声明即删除及其包围的部分。 根据类型参数的上下界推断并替换所有的类型参数为原生态类型如果类型参数是无限制通配符或没有上下界限定则替换为Object如果存在上下界限定则根据子类替换原则取类型参数的最左边限定类型即父类。 为了保证类型安全必要时插入强制类型转换代码。 自动产生“桥接方法”以保证擦除类型后的代码仍然具有泛型的“多态性”。如何进行擦除呢无限制类型擦除当类定义中的类型参数没有任何限制时在类型擦除中直接被替换为Object即形如T和?的类型参数都被替换为Object。有限制类型擦除当类定义中的类型参数存在限制上下界时在类型擦除中替换为类型参数的上界或者下界比如形如T extends Number和? extends Number的类型参数被替换为Number? super Number被替换为Object。如何证明类型的擦除呢原始类型相等publicclassTest{publicstaticvoidmain(String[]args){ArrayListIntegerlist1newArrayList();list1.add(123);ArrayListStringlist2newArrayList();list2.add(simon);//原始类型相等泛型被擦除System.out.println(list1.getClass()list2.getClass());//true}}利用反射publicclassTest{publicstaticvoidmain(String[]args)throwsException{ArrayListIntegerlist1newArrayList();list1.add(123);//使用反射调用addlist1.getClass().getMethod(add,Object.class).invoke(list1,simon);for(inti0;ilist1.size();i){System.out.println(list1.get(i));}}}C:\Program Files\Java\jdk1.8.0_152\bin\java.exe-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2026.1\lib\idea_rt.jar56034-Dfile.encodingUTF-8-classpathC:\Program Files\Java\jdk1.8.0_152\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar;D:\project\sgg\javase\out\production\javasecom.heima.base.fanxing.Test123simon如何理解类型擦除后保留的原始类型?原始类型就是擦除去了泛型信息最后在字节码中的类型变量的真正类型无论何时定义一个泛型相应的原始类型都会被自动提供类型变量擦除并使用其限定类型无限定的变量用Object替换。