一、泛型的基本概念

泛型是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. 股票移动平均线matlab,股票的移动平均线 (图文)
  2. 深入JDK源码,这里总有你不知道的知识点!
  3. 混合模式单点登录的实现
  4. js如何动态向 fileaddress: [fromurl]添加数据_N+增强能力系列(3) | 动态KV模块
  5. C++:搭建深度学习环境及实战
  6. react-native 环境配置遇到的问题
  7. arduino 上传项目出错_Arduino多核编程:简单例子
  8. [Python] 字典 get(key, default=None):获取字典中相应键的对应值
  9. linux环境sphinx搭建,linux系统环境下搭建coreseek(sphinx+mmseg3)
  10. ISIS路由聚合实验
  11. mysql中使用order by 排序时使用if()函数应用场景。
  12. BC66F3652研发笔记
  13. 什么是自然语言处理,自然语言处理能做什么,主要有哪些哪点?
  14. android如何使用ios14组件,iOS14如何添加和删除小组件 iOS14添加和删除小组件的方法...
  15. C中printf的输出格式类型和%g的用法
  16. 我的魅族开不了机了,一直卡在开机界面
  17. access创建窗体特别慢_Access 2016 创建窗体
  18. Unable to add window——token android.os.BinderProxy@196e65b8 is not valid;is your activit is running?
  19. 数据库入门---mysql
  20. 视频教程-2021软考系统集成项目管理工程师视频教程精讲 基础知识(下)-软考

热门文章

  1. Pr——保存裁剪过后的视频(去除黑边)
  2. 深入研究自动分配IPv6地址的Stateless(无状态)与Stateful(有状态)方式
  3. SQLServer 创建全文索引(两种方法)
  4. Adaptive Query Execution: Speeding Up Spark SQL at Runtime
  5. springboot反射执行private方法@Autowired字段为空
  6. 百德医疗上市遇挫:极其依赖单一产品,已签对赌协议,业绩承压
  7. Django在浏览器上显示本地图片
  8. 15 | 边界:微服务的各种边界在架构演进中的作用
  9. mysql主键能否有实际意义_数据库主键不应该具有任何业务意义
  10. C语言,可爱的小明特别喜欢爬楼梯,他有的时候一次爬一个台阶,有的时候一次爬两个台阶,有的时候一次爬三个台阶。如果这个楼梯有n个台阶,小明一共有多少种爬法呢?n值从键盘输入。