Generics 是 JDK 5.0 新增加的功能,在使用集合时,提供了一种编译时类型安全检查功能,并能减少类型强制转化的麻烦。

当从一个集合中取出一个元素时,例如使用 Iterator 接口中的 next() 方法,其返回值的类型是 Object 。在使用这个元素时,需要把返回值转换为元素本身的类型。这种类型转化是不安全的,因为在编译时不能进行类型检测,在运行时就可能发生异常。

ArrayList a = new ArrayList();
a.add(new Integer(1));
a.add(new Integer(2));
for(Iterator i = a.iterator(); i.hasNext(); ){int i1 = ((Integer)i.next()).intValue();
}

程序中 集合 a 中存储的是 Integer 类型的元素, next() 方法返回的是 Object 类型,需要把返回类型强制转化为 Integer 类型。

当 java 5.0 引入泛型后,集合框架中的大部分类和接口都增加了泛型类型声明,引入了一个名字为 E 的类型变量,例如:public class ArrayList < E > 。只要 把 E看做特殊类型的变量就可以了,它的值将是传递过来的任何类型的引用类型。在自己 的代码中引用泛型类,必须执行泛型类型的对象,并没有创建新的类。

泛型类型的调用通常被称为 参数化类型,为了实例化这个类,需要在类名称和括号之间加上 < Integer >。
上面的程序可以改写为:

ArrayList < Integer > a = new ArrayList < Integer > ();
a.add(new Integer(1));
a.add(new Integer(2));
for(Iterator < Integer > i = a.iterator(); i.hasNext();){int il = i.next().intValue();
}

代码中的 ArrayList < Integer > 指明了集合 a 中存储的元素的类型是 Integer。在通过 iterator 访问集合中的元素时,指明迭代器访问的元素类型,如下面的代码:

Iterator < Integer > i = a.iterator();

在具体的访问元素时,就不需要进行类型转化,如下面的代码:

int il = i.next().intValue();

使用 generics 可以清楚不安全的类型转化,省去了进行类型转换的代码,并在编译时进行类型检查,编译器认为 next() 方法返回的类型是元素的实际类型。在上面的程序中能够在编译时判断所调用的 intValue() 方法是否是元素类型中的方法。

Generics 是通过 “类型清楚(Type Erasure)” 实现的。 generics 的类型信息只在编译时存在,由编译器根据 generics 信息生成强制类型转化代码,编译成 class 文件后,就被编译器清除了。 这样能够保证强制类型转化是安全的。

用户也可以创建自己的泛型类型。

import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListDemo {public static void main(String[] args) {ArrayList <Integer> a = new ArrayList<Integer>();int sum = 0;a.add(new Integer(1));a.add(new Integer(2));for(Iterator <Integer> i = a.iterator(); i.hasNext();){sum += i.next().intValue();}System.out.println(sum );}
}
// 3

Generics (泛型)相关推荐

  1. Dart基础之Generics 泛型 <T>

    Java开发过程中,会通过重载实现根据不同的参数类型生成类似方法(多态),进一步可以通过 泛型 进一步提取基类方法:而对于 Dart 而言,为了解决多种方式构造对象的场景,也可以通过 Dart 中的 ...

  2. C# Generics 泛型

    C# Generics 泛型 泛型优点 性能 为了让方法传递任何类型的参数,可以用object类来传递参数.值类型转换为引用类型称为装箱,引用类型转换为值类型称为拆箱,需要强制转换.如下代码所示: 数 ...

  3. JavaSE-Adventure(III): Generics 泛型程序设计

    JavaSE-Adventure (III): 泛型程序设计 CONTENTS JavaSE-Adventure (III): 泛型程序设计 概述 泛型概念 泛型的提出背景 泛型的作用 使用泛型 泛型 ...

  4. typescript学习:Generics泛型

    本文内容如下 泛型Generics的了解与使用 如果你都有了答案,可以忽略本文章,或去TS学习地图寻找更多答案 泛型 定义:占位符,定义时不知道未来需要什么值,等调用的时候再传 作用:提升类,接口,方 ...

  5. 第四章 Generics - 泛型

    现在,你已经知道了Swift中如何实现基本的类和结构,但Swift的强大远不止如此.本章要讲的是Swift的另一个非常强大的语法:泛型. 对于类型安全的语言来说,都有一个常见的问题.想写一个作用于一种 ...

  6. TypeScript Generics(泛型)

    软件工程的一个主要部分就是构建组件,构建的组件不仅需要具有明确的定义和统一的接口,同时也需要组件可复用.支持现有的数据类型和将来添加的数据类型的组件为大型软件系统的开发过程提供很好的灵活性. 在C#和 ...

  7. Java基础学习——泛型(generics)学习一

    概述 在JDK 5.0,Java语言引入了好几个新的功能,其中很重要的一个就是泛型(generics). 本文就是对泛型的一个概述.你可以很熟悉其他语言中的类似结构,比如C++里的模板(templat ...

  8. 9.1-全栈Java笔记: 容器泛型—认识Collection接口

    开发和学习中需要时刻和数据打交道,如果组织这些数据是我们编程中重要的内容. 我们一般通过"容器"来容纳和管理数据.   事实上,数组就是一种容器,可以在其中放置对象或基本类型数据. ...

  9. java 泛型嵌套泛型_Java泛型嵌套

    package com.study.generics; //泛型的嵌套使用 public class GenericsDemo06 { public static void main(String [ ...

最新文章

  1. http://www.cnblogs.com/youfan/articles/3216816.html
  2. 在C语言中,double、long、unsigned、int、char类型数据所占字节数
  3. linux生成驱动编译的头文件,嵌入式Linux字符设备驱动——5生成字符设备节点
  4. Shift and Reverse
  5. c语言 三个小球排排坐,关颖三个孩子排排坐 太萌啦
  6. 20172319 《程序设计与数据结构》实验一报告
  7. 客户端主动断开连接_Go实现客户端和服务器抓包分析TCP三次握手和断开操作
  8. c语言qsort函数对结构体的一级排序,sort和qsort函数对结构体的二级排序
  9. 十九、FPGrowth算法介绍
  10. 《费马大定理》-站在巨人的肩膀上
  11. 关于bios+mbr还原uefi+gpt的系统后,出现进不去系统的问题
  12. R三星463无线网卡驱动,声音驱动程序,FN快捷键驱动,Easy_Display_Manager
  13. 数字化时代已经改变了我们的沟通方式
  14. 《我拼图贼6》游戏反馈栏
  15. 兴趣题:猴子吃桃问题
  16. 安全等保测评_等保二级和三级的区别
  17. win7与linux切换,Windows 7停更后不想用Win10?教你直接换上Linux再战
  18. 徐文长传奇李舟楫的博客新浪博客
  19. 办公技巧:如何修改PDF文件的日期格式
  20. 【Java选择语句(if,else,switch)】

热门文章

  1. 配置自定义docker镜像 (AWVS)
  2. conda的安装与使用
  3. 什么?使用JavaScript也可以编写桌面小组件?
  4. 周训练计划之(全身分化:腿、胸、背、腿、肩)
  5. 安装filezilla ftp客户端、版本升级、紧急升级
  6. Arduino(六)——蜂鸣器唱歌
  7. tplink-如何远程WEB管理路由器?
  8. 亲爱的,我只想好好的爱你疼你陪你一辈子
  9. java 逻辑运算符优先级_Java运算符及运算符的优先级
  10. 按钮文本左对齐/右对齐