Java 泛型分析
Java 泛型
Java Generics 是 JDK 1.5 引入的新特性,它提供了编译时的类型安全检测机制,避免了代码中进行显示的类型转换(cast),是对类型系统的一种增强。
Java Generics 引入了类型参数(type parameter),将集合元素的类型作为了参数。
Java 泛型的特点
1、泛型其实是一种语法糖。
(其他语法糖:自动装箱/拆箱,for-each,变长参数,条件编译,内部类,枚举类,断言语句,对枚举类和字符串的switch支持,try-with-resources)
泛型中的类型参数仅存在于编译期,在运行期会被擦除(erased)。
Once the compiler knows the element type of the collection, the compiler can check that you have used the collection consistently and can insert the correct casts on values being taken out of the collection.
插入元素时,编译器会检测插入元素的类型是否和类型参数兼容;
取出元素时,编译器会进行强制转换(在元素前加 cast)。
2、在一个类中定义以下两个方法,编译器会报错:Erasure of method XXX is the same as another method in type XXX。
原因:类型参数在编译后会被擦除,因此这两个方法在编译后是同一个方法。
有关方法签名的细节:在Java语言层面,方法签名(method signature)由方法名、参数列表组成;
而字节码层面,方法签名由方法名、参数列表和返回类型组成。
3、代码在编译期由编译器来检查类型安全。
对于开发者而言,代码可读性更强,更不容易出错(典型的更容易做对,更难做错)。
当然可以使用 cast 进行强制转换,由虚拟机在运行时检查实际类型是否相符;如果不符,抛出 ClassCastException。(可以使用 instanceof 判断类型)
4、可以使用 java.util.Collections 提供的 checkedCollection | checkedQueue | checkedSet | checkedSortedSet | checkedNavigableSet | checkedList | checkedMap | checkedSortedMap | checkedNavigableMap (装饰者模式)来提供运行时类型安全。
The
java.util.Collections
class has been outfitted with wrapper classes that provide guaranteed run-time type safety。
5、Java Generics 与 C++ template 不同。
Java generics 不会为每一个特化(specialization)产生一个新类,也不支持 template metaprogramming。
参考资料
https://docs.oracle.com/javase/8/docs/technotes/guides/language/generics.html
http://www.runoob.com/java/java-generics.html
最新文章
- MVVM大比拼小结
- Oracle系列——开发中奇葩问题你遇到几个(一)
- 推荐一个Jenkins 插件 Build Failure Analyzer
- 【Python】调用WPS V9 API,实现PPT转PDF
- C# nullable<;T>; 用法小结
- 【原创】Junit4详解一:Junit总体介绍
- c# 鼠标在控件上拖动 移动窗体 移动窗口
- win7 C# winForm编程 savefiledialog 不能弹出保存窗体
- Python:Python 3.x 的革新
- c++中获取字符cin,getchar,get,getline的区别
- Grunt 认识
- 构造函数语义学之Default Constructor构建操作
- POJ2449
- linux 命令后台执行
- php使用session来保存用户登录信息
- 解密电子书之一:电子墨水(eink)
- java 实现 一个账号只能在一个地方登陆,其他地方被下线
- 基于visual Studio2013解决C语言竞赛题之1020订票
- gcc及其选项详解 【转载】
- Redis 提供的好的解决方案 实例