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

最新文章

  1. MVVM大比拼小结
  2. Oracle系列——开发中奇葩问题你遇到几个(一)
  3. 推荐一个Jenkins 插件 Build Failure Analyzer
  4. 【Python】调用WPS V9 API,实现PPT转PDF
  5. C# nullable<T> 用法小结
  6. 【原创】Junit4详解一:Junit总体介绍
  7. c# 鼠标在控件上拖动 移动窗体 移动窗口
  8. win7 C# winForm编程 savefiledialog 不能弹出保存窗体
  9. Python:Python 3.x 的革新
  10. c++中获取字符cin,getchar,get,getline的区别
  11. Grunt 认识
  12. 构造函数语义学之Default Constructor构建操作
  13. POJ2449
  14. linux 命令后台执行
  15. php使用session来保存用户登录信息
  16. 解密电子书之一:电子墨水(eink)
  17. java 实现 一个账号只能在一个地方登陆,其他地方被下线
  18. 基于visual Studio2013解决C语言竞赛题之1020订票
  19. gcc及其选项详解 【转载】
  20. Redis 提供的好的解决方案 实例

热门文章

  1. Git和GitHub相关
  2. Hibernate -- Session的主键生成策略
  3. 一种根据value解释成枚举的有效方法
  4. js 小复习1
  5. KindEditor 上传文件
  6. requirejs打包项目
  7. 转:session和cookie以及catch三者的区别
  8. Fiddler工作原理与代理设置
  9. windows server 2016 docker 之创建使用虚拟交换机
  10. 转载 IO、文件、NIO【草案四】