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

Java 泛型分析的更多相关文章

  1. java泛型中使用的排序算法——归并排序及分析

    一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...

  2. Java泛型中<?> 和 <? extends Object>的异同分析

    相信很多人和我一样,接触Java多年,却仍旧搞不清楚 Java 泛型中 <?>和 <? extends Object>的相似和不同.但是,这应该是一个比较高端大气上档次的Que ...

  3. 【Java心得总结四】Java泛型下——万恶的擦除

    一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

  4. Java深度历险(五)——Java泛型

      作者 成富 发布于 2011年3月3日 | 注意:QCon全球软件开发大会(北京)2016年4月21-23日,了解更多详情!17 讨论 分享到:微博微信FacebookTwitter有道云笔记邮件 ...

  5. Java泛型-内部原理: 类型擦除以及类型擦除带来的问题

    一:Java泛型的实现方法:类型擦除 大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除.Java的泛型基本上都是在编译 ...

  6. Java 泛型,了解这些就够用了。

    此文目录: Java泛型是什么? 通常的泛型的写法示例 类型擦除 为什么要使用Java泛型 通过示例了解PECS原则 一.Java泛型是什么? 官方定义 泛型是Java SE 1.5的新特性,泛型的本 ...

  7. java 深度探险 java 泛型

    Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JD ...

  8. Java泛型总结

    1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...

  9. java泛型的讲解

    java泛型 什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指 ...

随机推荐

  1. spring cloud 基本小结

    Spring cloud系列十四 分布式链路监控Spring Cloud Sleuth https://blog.csdn.net/hry2015/article/details/78905489 S ...

  2. NextPermutation,寻找下一个全排列

    问题描述:给定一个数组是一个全排列,寻找下一个全排列.例如123->132, 321->123, 115->151. 算法分析:从后往前寻找顺序,找到后从往前寻找第一个大于当前元素, ...

  3. scala学习手记40 - case表达式里的模式变量和常量

    再来看一下之前的一段代码: def process(input: Any) { input match { case (a: Int, b: Int) => println("Proc ...

  4. Samba的安装配置使用

    ////////////////////////////////Samba//////////////////////////////////////////// 小常识:在同一局域网中,两个系统的工 ...

  5. angularjs1 自定义轮播图(汉字导航)

    本来想用swiper插件的,可是需求居然说要汉字当导航栏这就没办法了,只能自己写. directive // 自定义指令: Home页面的轮播图 app.directive('swiperImg', ...

  6. php中POST与GET区别

    如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...

  7. Java class、Object、Class 的区别

    Java的对象模型中: 所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例. 所有的类都最终继承自Object类,Class是类,那么Class也继承自Obj ...

  8. spring mvc: 密码框

    以user为例,包含username, password字段. user.java public class User { private String username; private Strin ...

  9. git rm -r --cached 去掉已经托管在git上的文件

    1.gitignore文件 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法.这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 ...

  10. N!含有多少个 2/5质因子

    编程之美127页,N!中含有质因数2的个数 = [N/2] + [N/4] + [N/8] + [N/16] + ..... 要理解上式,先看 编程之美126页,N!中含有质因数5的个数Z 举例:N ...