名词:泛型类 泛型方法 原始类型 子类型 版本 参数化类型 通配符类型 超类通配 子类通配 全通配
定义变量 创建对象 检查模板 类型实参 类型形参 补充 替代
语法特征:尖括号括起来的类型参数表
//不一定是术语,有些自己想的,主要是用于帮助理解概念。

1.什么是泛型
参数化类型,可以把类型当作参数使用。
普通的参数,形参是变量,实参是各种类型的值。
参数化类型,形参是变量,实参使用的类型。
2.为什么需要泛型
有需求:编写的代码可以被许多不同类型的对象所重用(这叫做泛型程序设计)。
起初这样的需求在Java中,通过单继承机制,强制类型转换实现。
1.5引入Java泛型机制,本质是对单继承实现的泛型程序设计的一种补充,让其更安全,可读性更好。

泛型的实现:
1.5以前java通过继承实现泛型,1.5引入类型参数机制,这是对原先继承实现的一种补充。

好处:
根据类型参数提供的信息//可读性好,看见类型参数就可知道使用的类型
1.进行编译检查,将原来运行时期的类型转换异常问题转到了编译时期,使问题在编译时期解决。//更安全
2.可以自动进行强制类型转换。不需要使用者强制类型转换了。//更安全

java泛型是编译时期的技术,确保类型安全,然后将所有子类型都处理为原始类型,生成的class文件是不带泛型的。
虚拟机并没有泛型。

泛型的擦除://为了兼容运行的类加载器。
编译时期在进行完编译检查等工作后,将所有泛型子类型都处理为原始类型。
泛型的补偿:
在运行时,通过获取元素的类型进行转换,不用使用者强制转换。

2.实现java语言对泛型的支持
a.Object方案
缺点:1.可以使用任意类型,没有错误检查2.获取时必须进行强制类型转换
b.类型参数方案
优点:可读性好,安全性高1.检查参数类型2.自动强制类型转换(都能减少错误的发生)

3.泛型的使用
(1.1)类型变量
类型参数(type parameters)通常用单个大写字母表示
命名泛型字母可以随意指定,尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2)
常见字母(见名知意)
T Type
K V Key Value
E Element
当类被使用时,会使用具体的实际类型参数(actual type argument)代替
(1.2)类型限定:一个类型变量或通配符可以有多个限定
<T extends BoundingType>
<T extends BoundingType1 & BoundingType2>
(1.3)通配符类型:
a.只能用来定义变量,不能创建对象。
b.通配符限定变量的类型,类型变量限定的是全部可用类型,两者限定的东西不同
全通配:
<?>
子类通配:
<? extends BoundingType>
超类通配:
<? super BoundingType>

名词:泛型类 泛型方法 原始类型 子类型 参数化类型 通配符类型 超类通配 子类通配 全通配
定义变量 创建对象 检查模板
语法特征:尖括号括起来的类型参数表
//不一定是术语,有些自己想的,主要是用于帮助理解概念。

(2)泛型类
<类型参数表>,并紧跟在类名后面,此处禁止使用通配符
(2.1)定义变量
Pair<String> p1 (只能引用Pair<String>对象)
Pair<Student> p2 (只能引用Pair<Student>对象)
p1和p2不能赋值,不同类型之间不能相互赋值
(2.2)创建对象
new Pair<String>(str1, str2)
new Pair<Student>(stu1, stu2)

(3)泛型接口
<类型参数表>,并紧跟在接口名后面
(4)泛型方法
<类型参数表>,并放在返回值前面,修饰符后面

定义变量:原始类型、子类型、通配类型都可以定义变量,不同变量之间赋值有限制。
(可以作为参数、返回值)
Pair pair
Pair<Employee> pair
Pair<? extends Employee> pair
Pair<? super Employee> pair
Pair<?> pair

Pair<T> pair//错误,不能用类型形参定义变量,用于泛型类和泛型方法的定义,在意义上等于Pair pair
创建对象:
new Pair()
new Pair<Employee>()
通配类型参数不能创建对象
创建数组:

---检查模板---引入概念,可以认为原始类型、子类型、通配类型使用不同的检查模板,但实现都为原始类型。
所有的泛型类对象最终都用原始类型实现,但不同的子类型它们的检查模板不同。

java泛型的约束
1.使用约束:不能创建子类型数组,类型擦除无法保证类型安全。
2.定义约束:主要是泛型类和泛型方法定义时,类型形参不能用来创建对象和数组,只能定义变量

桥方法:
当普通类继承泛型子类型时,并覆盖了类型方法(即在参数或返回值中使用了类型参数的方法)
就会生成桥方法,保持多态。
举例:
DateInterval extends Pair<LocalDate>
当DateInterval类有void setSecond(LocalDate second)时,会自动生成一个桥方法,内部调用新方法
void setSecond(Object second){setSecond((LocalDate) second)}

泛型实例:
1.分页的Page
2.Comparator和Comparable
3.java.util.Arrays和java.util.Collections中的sort方法
4.集合框架

java泛型笔记一的更多相关文章

  1. java泛型笔记

    目录 概述 什么是泛型?为什么使用泛型? 例子 特性 使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法的基本用法 泛型方法与可变参数 静态方法与泛型 泛型 ...

  2. 笔记-java泛型详解

    首先,先说明一下,java泛型文章的出处:http://www.cnblogs.com/lzq198754/p/5780426.html 作为学习笔记保存. 1.为什么需要泛型 泛型在Java中有很重 ...

  3. Java开发笔记(六十八)从泛型方法探究泛型的起源

    前面介绍各种容器之时,通过在容器名称后面添加包裹数据类型的一对尖括号,表示该容器存放的是哪种类型的元素.这样一来总算把Java当中的各类括号都凑齐了,例如包裹一段代码的花括号.指定数组元素下标的方括号 ...

  4. Java泛型学习笔记 - (七)浅析泛型中通配符的使用

    一.基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unbounded Wildcards), 就是<?>, 比如List< ...

  5. Java学习笔记(二一)——Java 泛型

    [前面的话] 最近脸好干,掉皮,需要买点化妆品了. Java泛型好好学习一下. [定义] 一.泛型的定义主要有以下两种: 在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个 ...

  6. Java学习笔记--泛型

    一个泛型类就是具有一个或者多个类型变量的类. 我们可以只关注泛型,而不会为数据存储的细节而烦恼 . java泛型(一).泛型的基本介绍和使用 http://blog.csdn.net/lonelyro ...

  7. Java泛型学习笔记--Java泛型和C#泛型比较学习(一)

    总结Java的泛型前,先简单的介绍下C#的泛型,通过对比,比较学习Java泛型的目的和设计意图.C#泛型是C#语言2.0和通用语言运行时(CLR)同时支持的一个特性(这一点是导致C#泛型和Java泛型 ...

  8. Java泛型读书笔记 (一)

    Java泛型 在Java SE7和之后的版本中,在new一个泛型类实例的时候,可以不传入类型参数,因为Java编译器可以通过赋给的变量类型声明推断出来,如下代码: ArrayList<Strin ...

  9. Java泛型读书笔记 (二)

    关于Java泛型擦除后,继承一个泛型类带来的问题 有如下泛型类Pair: public class Pair<T> { private T second; private T first; ...

随机推荐

  1. CRM 安装不规范,亲人两行泪

    安装CRM需要严格按照CRM部署文档的要求进行,比如设置CRM服务的服务账号一定要加入到CRM所在组织库用户里,不然会遇到下面错误.这个就是传递到SQL 的账号,在SQL那边不识别 <s:Env ...

  2. 我所认为的KVC和KVO

    引子:    ​   为什么要写这个,只是突然一个念头闪现,说一下本人目前理解.KVC:    ​   Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制.但是关就这一 ...

  3. 遇到的一个Form表单自动提交问题解决办法

    Form 表单中只有一个 input 元素时按回车会默认提交表单.有的时候我们希望按回车可以进行列表查询,但是查询后表单被自动提交了,然后刷新了整个页面.这个时候就需要对这个 Form 表单处理一下以 ...

  4. Android 反编译工具

    想必玩安卓的童鞋大多都知道,安卓的APK安装包是可以反编译出源代码的,如果开发人员发布时没有对其混淆等加密处理,反编译出来的代码几乎与真实的源代码一模一样. 想要反编译apk,需要用到apktool. ...

  5. input表单元素的默认padding不一致问题

    最近做的项目,发现一堆问题,input type=“text”和type=“button” (1)在无文字的时候高度是一致的,分别写入相同大小的文字type=“button”高度>type=“t ...

  6. Local storage htm5

    使用本地存储,web应用可以在用户浏览器中本地存储数据. 在HTML5之前,应用数据存储必须使用cookie,包括每个服务端的请求,本地存储更加安全,并且可以存储大量的数据到本地,不影响网站的性能. ...

  7. D3.JS V4 绘制中国地图

    参考:http://bl.ocks.org/almccon/fe445f1d6b177fd0946800a48aa59c71 http://blog.csdn.net/lzhlzz/article/d ...

  8. HDU5919 Sequence2

    传送门 这道题是主席树好题啊-- 题目大意:给定一个序列,每次给定一段区间,区间内所有不同的数第一次出现的位置排成一个序列,求这个序列的中位数. 其实求中位数并不是很难,只要我们能把这个序列中不同的数 ...

  9. MongoDB 复制集节点增加移除及节点属性配置

    复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...

  10. C语言解释器的实现--存储结构(一)

    目录: 1. 内存池 2. 栈 3. Hash表 1.内存池  在一些小的程序里,没什么必要添加内存管理模块在里面.但是对于比较复杂的代码,如果需要很多的内存操作,那么加入自己的内存管理是有必要的.至 ...