今天看了一下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,这个有点不理解了。不知有没有高手出来释疑解惑一下?
相关推荐
10. **垃圾回收与内存管理**:Java的自动内存管理是其的一大特点,习题可能讨论如何理解和避免内存泄漏,以及如何优化对象的生命周期。 通过仔细研究这个习题答案指南,你不仅可以加深对Java语言的理解,还能掌握更...
《JAVA解惑》是Java开发者领域的一本经典著作,它被广大...总之,《JAVA解惑》是一本涵盖了Java核心知识点、实战技巧和高级特性的宝典,无论你是Java新手还是老手,都能从中受益匪浅,解决你在Java编程中的种种疑惑。
13. **Java泛型**:理解泛型的引入和使用,以及泛型通配符和边界。 14. **枚举和注解**:介绍枚举类型的应用,以及注解的作用和自定义注解。 15. **Java 8新特性**:讲解Lambda表达式、函数式接口、Stream API等...
5. **泛型**:Java 5引入的泛型是一种强大的类型系统增强,它允许在编译时检查容器中的对象类型,减少类型转换的麻烦,提高代码的健壮性。 6. **异常处理**:异常处理是Java编程中的重要部分,书中详细解释了try-...
这本书通常会讨论设计模式、泛型、I/O、网络编程、并发和异常处理等方面。 5. **test**: 这个文件名可能是测试代码或者练习项目,提供实际编程练习,帮助巩固理论知识。通过解决实际问题,学习者可以更好地理解Java...
6. **交流讨论**:与他人分享学习心得,通过讨论解决疑惑,共同进步。 总之,这个名为"study1010_bursttpf_java学习_源码.zip"的压缩包提供了丰富的Java学习素材,无论是初学者还是有经验的开发者,都能从中受益。...
同时,遇到问题时不要怕麻烦,多查阅文档,参考相关教程,甚至参与在线编程社区的讨论,都能帮助你解决疑惑,加速学习进程。记住,编程是一项需要持续学习和实践的技能,只有不断挑战自己,才能不断进步。
8. **垃圾回收与内存管理**:讨论了Java的垃圾收集机制,理解内存分配和回收的重要性,以及如何避免内存泄漏。 9. **设计模式**:讲解了一些经典的设计模式,如工厂模式、单例模式、装饰器模式等,以及如何在实际...
SCJP(Sun Certified Programmer for the Java 2 Platform, Standard Edition 6)是...为了顺利通过SCJP认证,除了做题库外,还应阅读官方文档,参考权威教材,以及参加在线讨论和解答疑惑,全面提升Java编程技能。
- **Module7**:可能关于接口、内部类、匿名类和访问控制修饰符的进一步讨论。 - **Module8**:可能包含高级主题,如枚举、注解(Annotations)、IO流的NIO.2 API、 Lambda表达式和Stream API(Java 8及以上版本)...
例如,Java 5引入了泛型、枚举、增强for循环等;Java 7增加了try-with-resources语句和文件系统API;Java 8引入了lambda表达式、函数式接口和日期时间API;Java 9开始采用模块化系统(Project Jigsaw)。 3. **Java...