今天看了一下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的修改的):
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); } }
运行结果:
true true java.util.ArrayList java.util.ArrayList
JDK自带的javap命令反编译的结果:
[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反编译结果如下:
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的通过反编译的结果来说泛型在编译后被擦出了,这个说法不太妥。
但是那两个类型比较的结果又是ture,这个有点不理解了。不知有没有高手出来释疑解惑一下?
相关推荐
在Java编程语言中,有很多细节和特性可能会...通过深入学习和实践,初学者可以逐渐克服这些疑惑,成为一名熟练的Java开发者。"JAVA解惑.pdf"这份文档很可能详细阐述了这些问题,建议仔细阅读,以便更好地理解Java编程。
8. **泛型**:Java泛型引入了类型安全,增强了代码的可读性和可维护性。书中会探讨泛型的基本概念,通配符,以及在设计API时如何有效地使用泛型。 9. **模块化系统**:Java 9引入了模块系统(Project Jigsaw),...
4. **泛型**:泛型的引入增强了类型安全,习题会涵盖泛型类、泛型方法、通配符等方面,答案将展示如何编写和使用泛型代码。 5. **多线程**:Java提供了丰富的多线程支持,习题可能涉及到线程的创建、同步、通信等...
《Java编程思想》是 Bruce Eckel 的经典之作,它深入浅出地介绍了Java这门强大的编程语言。...通过对照书本和答案,你可以独立完成练习,也可以查找疑惑,这对于学习和进阶Java编程都是非常有价值的资源。
这本书深入浅出地讲解了Java语言的核心概念和技术,包括面向对象编程、泛型、集合框架、多线程、网络编程等。本书的习题答案是学习过程中不可或缺的参考资料,可以帮助读者检验自己的理解并解决疑惑。 习题解答通常...
《Java解惑》是一本专为Java初学者和进阶者设计的指南,旨在帮助读者解决在学习和...以上知识点只是《Java解惑》中的一部分,通过深入学习和实践,你可以逐步解开Java编程中的种种疑惑,成为一名更优秀的Java开发者。
本压缩包“java_faq.rar”包含了关于Java编程的常见问题集锦,旨在帮助开发者解决在学习和实践中遇到的问题。 “Java常见问题集锦.pdf”很可能是文档形式的问题解答大全,它可能涵盖了以下几个方面: 1. **基础...
桥接方法是Java泛型和类型擦除的产物。当泛型方法的实现需要与非泛型接口兼容时,编译器会生成桥接方法来桥接泛型和非泛型之间的差异。例如,假设有一个泛型接口: ```java public interface MyInterface<T> { ...
这份"Java语言程序设计进阶篇答案与代码"资源将帮助你巩固以上知识点,通过实际代码示例加深理解,解决练习题疑惑,提升编程能力。学习过程中,你可以对照代码理解讲解,结合实际运行结果,加深对Java语言特性的掌握...
这份名为"JAVA-FAQ.rar_The Java FAQ_java编程"的压缩包提供了一个Java编程的常见问题解答集锦,帮助开发者解决他们在编程过程中可能遇到的疑惑。"JAVA FAQ.pdf"是其中的主要文档,包含了丰富的知识内容。 首先,这...
《JAVA解惑》是Java开发者领域的一本经典著作,它被广大...总之,《JAVA解惑》是一本涵盖了Java核心知识点、实战技巧和高级特性的宝典,无论你是Java新手还是老手,都能从中受益匪浅,解决你在Java编程中的种种疑惑。
8. **泛型**:自Java 5引入,泛型提供了编译时类型安全,允许在容器中存储特定类型的元素。 9. **反射**:Java反射API允许程序在运行时动态地获取类的信息并操作类的对象。 10. **枚举和注解**:枚举提供了一种...
13. **Java泛型**:理解泛型的引入和使用,以及泛型通配符和边界。 14. **枚举和注解**:介绍枚举类型的应用,以及注解的作用和自定义注解。 15. **Java 8新特性**:讲解Lambda表达式、函数式接口、Stream API等...
本资料集合了这些题目及其详尽的答案,旨在帮助读者巩固所学知识,解决在学习过程中遇到的疑惑。 1. **基础篇复习题**:这部分涵盖了Java语言的基本语法、数据类型、控制结构(如if语句、for循环和while循环)、...
在Java的世界里,疑惑可能涵盖语法、类库、框架、并发、内存管理等多个方面。下面,我们将深入探讨一些常见的Java解惑知识点。 1. **Java基础** - **变量与数据类型**:Java支持基本数据类型(如int、double等)和...
5. **泛型**:Java 5引入的泛型是一种强大的类型系统增强,它允许在编译时检查容器中的对象类型,减少类型转换的麻烦,提高代码的健壮性。 6. **异常处理**:异常处理是Java编程中的重要部分,书中详细解释了try-...
6. **泛型**:泛型引入于Java 5,用于增强类型安全并消除强制类型转换。泛型可以应用于类、接口和方法,提供了一种在编译时检查类型安全的方式。 7. **IO流**:Java的IO流用于处理输入输出操作,包括字符流和字节流...
Java语言是目前世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。...同时,课后答案部分可以帮助验证理解和解决疑惑,提高学习效率。在实践中不断练习和应用,将有助于成为熟练的Java开发者。
例如,Java中的接口和抽象类可以用于实现各种数据结构,而泛型则提供了类型安全的容器。 习题答案部分则是学习过程中不可或缺的一部分。通过解答书中给出的习题,读者可以检验自己的理解,解决疑惑,并且通过对比...
下面将详细探讨一些常见的Java知识点,以解答可能出现的疑惑。 1. **内存管理与垃圾回收**:Java通过自动垃圾回收机制管理内存,避免了程序员手动释放内存可能导致的问题。理解对象生命周期、引用类型(强引用、软...