今天看了一下java的泛型,在网上找到一片文章:
java 泛型 深入
http://www.blogjava.net/fancydeepin/archive/2012/08/25/386241.html
文章作者fancydeepin。
fancydeepin在文中说,“运行期间泛型并不存在,它在编译完成之后就已经被擦除了。”,并都给出了例子。
但是我试验过后发现泛型并没有在编译完成之后就被擦除。
试验环境:CentOS6.2,Oracle JDK 1.7.0_40,JD-GUI0.3.5
下面是我的试验代码(根据fancydeepin的修改的):
Java代码
package forenroll; import java.util.ArrayList; import java.util.List; public class Test { List<Integer> interview = new ArrayList<Integer>(); public void test(List<String> list){ List<String> list1 = new ArrayList<String>(); List<Integer> list2 = new ArrayList<Integer>(); System.out.println(list1.getClass() == list2.getClass()); // 输出结果: true System.out.println(list1.getClass() == interview.getClass()); // 输出结果: true System.out.println(list1.getClass().getName()); // 输出结果: java.util.ArrayList System.out.println(list2.getClass().getName()); // 输出结果: java.util.ArrayList } public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); List<Integer> list2 = new ArrayList<Integer>(); Test test = new Test(); test.test(list1); } }
运行结果:
Java代码
true true java.util.ArrayList java.util.ArrayList
JDK自带的javap命令反编译的结果:
Java代码
[forenroll@forenroll forenroll]$ javap Test Warning: Binary file Test contains forenroll.Test Compiled from "Test.java" public class forenroll.Test { java.util.List<java.lang.Integer> interview; public forenroll.Test(); public void test(java.util.List<java.lang.String>); public static void main(java.lang.String[]); }
main方法里面的两句代码不知道为什么没有反编译出来。但是我用jd-gui这个工具反编译出来的结果里面是有的,jd-gui反编译结果如下:
Java代码
package forenroll; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; public class Test { List<Integer> interview = new ArrayList(); public void test(List<String> list) { List list1 = new ArrayList(); List list2 = new ArrayList(); System.out.println(list1.getClass() == list2.getClass()); System.out.println(list1.getClass() == this.interview.getClass()); System.out.println(list1.getClass().getName()); System.out.println(list2.getClass().getName()); } public static void main(String[] args) { List list1 = new ArrayList(); List list2 = new ArrayList(); Test test = new Test(); test.test(list1); } }
根据通过javap命令和jd-gui工具之间的反编译结果,fancydeepin通过反编译的结果来说泛型在编译后被擦出了,我觉得这个说法不太妥。
另外,javap和JD-GUI的反编译结果也不同(主要在方法体中的内容),这个反编译出来的泛型被擦除的原因是不是反编译器在反编译的过程中做了什么处理?因为fancydeepin与我的环境和JDK版本可能都不一样。
但是那两个类型比较的结果又是ture,这个有点不理解了。不知有没有高手出来释疑解惑一下?
相关推荐
Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南
Java Generics and Collections 英文版,详细描述java 泛型技术
java 泛型接口示例 java 泛型接口示例 java 泛型接口示例
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例
java 泛型方法使用示例 java 泛型方法使用示例 java 泛型方法使用示例
java泛型技术之发展,学习JAVA 泛型的不错东东
java 泛型 java 泛型 java 泛型 java 泛型
关于java基础的泛型的练习
1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1.java泛型定义.zip1....
java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx
谈谈关于Microsoft Visual Studio 2008中C#和java泛型的区别
深入理解java泛型,包括类名泛型的定义,方法泛型定义,泛型的返回
4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip4.java泛型的限制.zip...
java泛型详解.pdf
很好的Java泛型的总结,看完之后你一定会知道java泛型的底层机制,你一定会学会Java泛型!
主要介绍了Java泛型的用法及T.class的获取过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java泛型技术之发展
思维导图之Java泛型详解