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. No toolchains found in the NDK toolchains folder for ABI with prefix

    通过Android Studio 的Sdk Manager安装NDK,安装完之后编译失败,报错信息如下: No toolchains found in the NDK toolchains folde ...

  2. 51nod-1636-dp

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1636 1636 教育改革 题目来源: CodeForces 基准时间限制 ...

  3. IOS-SDWebImage根据网络状态加载图片

    iOS开发-你真的会用SDWebImage? 2016-05-17 hosea_zhou 有意思啊 原创作者:hosea_zhou 原文地址:http://www.jianshu.com/p/dabc ...

  4. [转载]java向word模板中填充数据(总结)

    使用过PageOffice动态生成word文档的人都知道,PageOffice可以给word文档的指定位置进行填充,这里我们所说的指定位置在PageOffice的专业术语里面有两个概念,一个叫做数据区 ...

  5. Lucene快速入门

    1. 什么是lucene lucene是Apache的一个全文检索工具,使用lucene能快速实现全文检索功能.Lucene是一个工具包,你可以调用它的函数, 但它不能独立运行,不单独对外提供服务. ...

  6. UIView常用属性与方法/UIKit继承结构

    UIView常用属性与方法 @interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDy ...

  7. HAWQ取代传统数仓实践(八)——维度表技术之角色扮演维度

    单个物理维度可以被事实表多次引用,每个引用连接逻辑上存在差异的角色维度.例如,事实表可以有多个日期,每个日期通过外键引用不同的日期维度,原则上每个外键表示不同的日期维度视图,这样引用具有不同的含义.这 ...

  8. plsql基本操作 复制表 导出表 导出表结构 及其导入

    上一片中介绍了安装instantclient +plsql取代庞大客户端的安装,这里说下plsql的基本操作 plsql操作界面图: 1.复制表 语句:create table IGIS_COPY a ...

  9. vue前端开发那些事——vue组件开发

    vue的学习曲线不是很陡(相比其它框架,如anglarjs),官方文档比较全面,分为基础篇和高级篇.我们刚开始学习的时候,肯定像引用jquery那样,先把vue的js引进来,然后学习基础内容.如果仅仅 ...

  10. C# 操作自定义config文件

    示例文件:DB.config 1.读取 //先实例化一个ExeConfigurationFileMap对象,把物理地址赋值到它的 ExeConfigFilename 属性中: ExeConfigura ...