一、泛型的基本概念

泛型是JDK1.5的一种新特性,它的本质是参数化类型的应用,也就是说操作的数据类型被指定为一个参数,在用到的时候再指定具体的类型。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类,泛型接口和泛型方法。

泛型思想早在C++语言的模板(Templates)中就开始生根发芽,在Java语言处于还没有出现泛型的版本时,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型泛化。例如在哈希表的存取中,JDK 1.5之前使用HashMap的get()方法,返回值就是一个Object对象,由于Java语言里面所有的类型都继承于java.lang.Object,那Object转型为任何对象成都是有可能的。但是也因为有无限的可能性,就只有程序员和运行期的虚拟机才知道这个Object到底是个什么类型的对象。在编译期间,编译器无法检查这个Object的强制转型是否成功,如果仅仅依赖程序员去保障这项操作的正确性,许多ClassCastException的风险就会被转嫁到程序运行期之中。

泛型技术在C#和Java之中的使用方式看似相同,但实现上却有着根本性的分歧,C#里面泛型无论在程序源码中、编译后的IL中(Intermediate Language,中间语言,这时候泛型是一个占位符)或是运行期的CLR中都是切实存在的,List与List就是两个不同的类型,它们在系统运行期生成,有自己的虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现的泛型被称为真实泛型。

Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原始类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList与ArrayList就是同一个类。所以说泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。(类型擦除在后面在学习)

使用泛型机制编写的程序代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性。泛型对于集合类来说尤其有用。

泛型程序设计(Generic Programming)意味着编写的代码可以被很多不同类型的对象所重用。

二、实例分析

在JDK1.5之前,Java泛型程序设计是用继承来实现的。因为Object类是所用类的基类,所以只需要维持一个Object类型的引用即可。就比如ArrayList只维护一个Object引用的数组:

public class ArrayList//JDK1.5之前的
{public Object get(int i){......}public void add(Object o){......}......private Object[] elementData;
}

这样会有两个问题:

没有错误检查,可以向数组列表中添加类的对象
在取元素的时候,需要进行强制类型转换
这样,很容易发生错误,比如:

/**jdk1.5之前的写法,容易出问题*/ArrayList arrayList1=new ArrayList();arrayList1.add(1);arrayList1.add(1L);arrayList1.add("asa");int i=(Integer) arrayList1.get(1);//因为不知道取出来的值的类型,类型转换的时候容易出错
这里的第一个元素是一个长整型,而你以为是整形,所以在强转的时候发生了错误。

所以。在JDK1.5之后,加入了泛型来解决类似的问题。例如在ArrayList中使用泛型:

/** jdk1.5之后加入泛型*/ArrayList<String> arrayList2=new ArrayList<String>();  //限定数组列表中的类型
//      arrayList2.add(1); //因为限定了类型,所以不能添加整形
//      arrayList2.add(1L);//因为限定了类型,所以不能添加整长形arrayList2.add("asa");//只能添加字符串String str=arrayList2.get(0);//因为知道取出来的值的类型,所以不需要进行强制类型转换

还要明白的是,泛型特性是向前兼容的。尽管 JDK 5.0 的标准类库中的许多类,比如集合框架,都已经泛型化了,但是使用集合类(比如 HashMap 和 ArrayList)的现有代码可以继续不加修改地在 JDK 1.5 中工作。当然,没有利用泛型的现有代码将不会赢得泛型的类型安全的好处。

参考:架构师筑基必备技能:深入Java泛型,泛型的作用与定义

下一篇 【泛型】通配符与嵌套

【泛型】泛型的作用与定义相关推荐

  1. c# 泛型有什么作用?

    泛型通俗的理解 就是限制list集合里面的数据类型 比如List<int> 就限制LIST里面必须是int,这样放入其他就有报错(保证了安全),然后从 list里取元素,就不需要强制转化成 ...

  2. Java泛型-泛型作用+泛型在各种数据结构中的使用+自定义泛型

    文章目录 1. 概念 2. 为什么要使用泛型(Generic) 2.1 在ArrayList中使用泛型 2.2 在HashMap中使用泛型 3. 自定义泛型结构 3.1 泛型类与泛型接口 3.2 泛型 ...

  3. java里程碑之泛型--泛型基本语法

    1,java7提供的泛型菱形语法 在java7之前,如果使用带泛型的接口和类定义变量初始化对象的时候,构造器后面也必须带上泛型,这有点恶心的.以前我在公司一直使用的java6,所以我也已经习惯了这种写 ...

  4. JAVA基础03-Object类,常用类,基本的数据结构, Collection常用体系,泛型-泛型通配符

    1.object类 1.概述 java.lang.object类是java语言中的根类,即所有类的超类(基类)他描述的所有的方法子类都可以使用,在对象实例化的时候最终找到的类就是object 如果一个 ...

  5. Python从入门到精通 | Python作用与定义 | 三种注释的语法(三)

    1 课程 - 任务 1.1 任务清单 序号 内容 学习 难度 1 三种注释方式的定义 掌握 ★★ 2 注释的作用 掌握 ★★ 3 如何正确的写注释 掌握 ★★ 4 变量作用和定义 掌握 ★★ 5 变量 ...

  6. 什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数

    什么是纯虚函数 纯虚函数的作用 如何定义使用纯虚函数   一 定义: 纯虚函数是一种特殊的虚函数,它的一般格式如下:  class <类名>  {  virtual <类型>& ...

  7. python数据类型怎么定义_Python的五大数据类型的作用、定义方式、使用方法

    一.简述Python的五大数据类型的作用.定义方式.使用方法: 1. 数字类型int: 1.整形 作用:可以表示人的年龄,身份证号码,身高和体重等 定义方式: weight = 130 print(w ...

  8. 13章、Java泛型——泛型的定义与作用

    课程大纲 1.为什么需要泛型 2.什么是泛型 3.自定义泛型接口.泛型类 4.通配符 5.泛型方法 6.泛型的嵌套使用 1.为什么需要泛型 List list = new ArrayList(); l ...

  9. 深入Java泛型(一):作用与定义

    一.泛型的基本概念 泛型的定义: 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体 ...

最新文章

  1. keil uvision2 c语言调试,keil uvision2
  2. oracle11g数据文件路径,oracle11g trace路径和diagnostics路径的变化
  3. 2017 成为更好的自己需要做的事情
  4. openfire spark用户名问题续
  5. ASP.Net本地化/国际化解决方案原理和代码示例
  6. HTML与css语法笔记
  7. 关于Sql Server2012(.net framework 3.5安装)安装问题
  8. VBA写入公式(4):数字转大写金额公式
  9. dropbox for android,Dropbox
  10. 前端代码 review 流程规范
  11. 为何说 a16z 是一家通过 VC 获利的媒体公司?
  12. 百行代码发射红心,程序员何愁命不中女朋友!
  13. tableau_9_快速表计算、自定义表计算、计算字段
  14. kk-anti-reptile——Spring Boot 反爬虫,防止接口盗刷
  15. 转业费计算器2019_退役金计算器 版 含现役工资和转业费计算
  16. 【C++】构建一个正方形类
  17. 安装allennlp ,使用Elmo
  18. RSA加解密过程详解
  19. 百度云管家下载大文件龟速问题解决
  20. 解决ubuntu启动在紫色界面冻结

热门文章

  1. 基本图算法时间复杂度
  2. python导入数据库的数据怎么在qt界面里刷新_python爬虫开发通过qt界面显示,爬取数据只能显示最后一次循环结果,appen追加时程序卡住。(已经解决)!!!...
  3. [HTML+CSS] 仿京东首页项目实战
  4. python3wxpy下载_如何利用python之wxpy模块玩转微信
  5. frp网络穿透(frps,frpc)
  6. java joinpoint教程_aop 中joinpoint的使用方法
  7. python数据类型转换——矩阵float转int
  8. Python类中的self是什么意思?
  9. 07 | Raft算法(一):如何选举领导者
  10. ResultType和ResultMap的区别