目录
一、泛型的引入
二、泛型
2.1 泛型的基础介绍
2.2 泛型类
2.3 泛型的意义
2.4 泛型的编译机制——擦除机制
2.5 泛型类上界的引入
2.5.1基于equals方法
2.5.2直接调用comparable或comparator的compareto方法
2.5.3 引入泛型的上界
2.5.4 泛型方法
2.6 通配符
2.7 泛型中的父子类关系
三、泛型的总结
3.1 注意事项
3.2 泛型的限制
一、泛型的引入
用创建一个顺序表举例。
1.创建一个顺序表,只能存储int类型的元素。
2. 想要建立一个顺序表,可以存放任何一种类型的元素。
思路:由于Object类是Java中所有类的祖先类,因此,可以将顺序表中的类型定义设置为Object
但是,这样会存在两个问题:
问题1:往顺序表中添加数据时,什么类型都可以放,成了大杂烩。
问题2:在得到顺序表的元素时。即使知道元素的类型,还需要进行强制类型转换。
为了解决以上两个问题,引入了泛型的语法。
二、泛型
2.1 泛型的基础介绍
1. <>是泛型的标志
2. 泛型的类型参数
E:Element
K:Key
V:Value
N:Number
T:Type
3. 泛型有两种,泛型类和泛型方法。
2.2 泛型类
泛型类的参数必须为类类型,如果是简单类,必须是对应的包装类。
泛型类可以一次有多个类型的变量,用逗号分隔。
2.3 泛型的意义
自动进行类型的检查,自动进行类型的转换。
2.4 泛型的编译机制——擦除机制
擦除机制:在编译时,将T类型擦除为Object类,运行时,为Object类。
该机制只作用于编译期间,运行期间没有泛型的概念。
2.5 泛型类上界的引入
以寻找顺序表中的最大值为例,先将第一个元素设置为max,再将其他元素逐次与max进行比较。在写的时候,会发现无法直接比较大小。主要原因是:顺序表中的T可以为基本类型,也可以为自定义类型。基本类型可以直接比较大小。如果是自定义类型,有三种方法可以比较大小,①重写equals方法②实现comparable接口③实现comparator接口。因此,需要找出一种方法,使得该方法对基本类型和自定义类型都可以通用。
2.5.1基于equals方法
该方法只能比较是否相等,不能比较大小。
2.5.2直接调用comparable或comparator的compareto方法
直接调用会有问题,主要原因是:由于泛型的编译机制,运行时,max已经被擦除为Object类,Object类没有实现compareto方法。所以没办法调用。
2.5.3 引入泛型的上界
通过引入泛型的上界,T实现了Comparable接口,所以可以调用compareto方法进行比较大小。可以理解为擦除到Comparable接口的地方。
2.5.4 泛型方法
为了在调用泛型类方法之前不用去new一个泛型类对象,引入了泛型类方法。
2.6 通配符
?代表通配符。通配符就是一个占位符,可以表示任何类。比泛型还泛型。
通配符有上界和下界。
2.7 泛型中的父子类关系
例如:
ArrayList
ArrayList> 是ArrayList extends Number> 的父类。原因是:ArrayList>的上界是Object,ArrayList extends Number>的上界是Number,Object是Number的父类。
ArrayList extends Number> 是ArrayList
三、泛型的总结 3.1 注意事项
<>是泛型的标志。
泛型的意义在于可以自动进行类型的检查和自动进行类型的转化。
泛型的编译机制是擦除机制。在运行期间没有泛型的概念。
泛型有上界。
通配符有上界和下界。
无法根据泛型确定父子类关系,可以通过通配符确定父子类关系。
3.2 泛型的限制
泛型类型参数不支持基本数据类型。
无法实例化泛型类型的对象。
无法使用泛型类型声明静态的属性。
无法使用Instanceof判断带类型参数的泛型类型。
无法创建泛型类数组。
无法create、catch、throw一个泛型类型。(异常不支持泛型)
泛型类型不是形参的一部分,无法重载。



