java泛型证明只在编译期有效证明
1.提出问题和前提
- 问题
1.之前学习java基础的时候老说java泛型是一种语法糖,为啥是语法糖
2.泛型只在编译期有效,为啥
3,我不用泛型也不会报错,为啥
- 前提
安装java反编译工具
jd-gui.exe
2.证明
说明:
为了证明简单,我们就是用ArrayList使用泛型进行测试
- 定义一个简单pojo类
public class Demo {
private Integer id;
private String name;
//省略get/set等方法,和本次测试无关
}
- 写测试类
package com.shaoming.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FanXin {
public static void main(String[] args) {
//单行注释
/*
* 多行注释
*/
/**
* 文档注释
*/
List<String> strList = new ArrayList<>();
strList.add("aaa");
strList.add("aaa");
strList.add("aaa");
for (String string : strList) {
System.out.println(string);
}
Demo demo = new Demo();
demo.setId(1);
demo.setName("测试的name");
List<Demo> demoList = new ArrayList<>();
demoList.add(demo);
demoList.add(demo);
for (Iterator<Demo> iterator = demoList.iterator(); iterator.hasNext();) {
Demo demo1 = iterator.next();
System.out.println(demo1);
}
}
}
- 使用反编译工具进行对.class文件反编译
反编译内容如下:
package com.shaoming.util;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FanXin
{
public static void main(String[] args)
{
List strList = new ArrayList();
strList.add("aaa");
strList.add("aaa");
strList.add("aaa");
for (String string : strList) {
System.out.println(string);
}
Demo demo = new Demo();
demo.setId(Integer.valueOf(1));
demo.setName("测试的name");
Object demoList = new ArrayList();
((List)demoList).add(demo);
((List)demoList).add(demo);
for (Iterator iterator = ((List)demoList).iterator(); iterator.hasNext(); ) {
Demo demo1 = (Demo)iterator.next();
System.out.println(demo1);
}
}
}
说明:
我是用的是javaproject项目进行测试的
FanXin.java的字节码文件在项目路径下的bin目录里面
比如说
FanXin.java文件路径是D:\eclipsewworkspace\java_demo\src\com\shaoming\util\FanXin.java
FanXin.clas文件路径是D:\eclipsewworkspace\java_demo\bin\com\shaoming\util\FanXin.class
3.结论
反编译结果证明泛型值只在编译器有效