这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
一、泛型的定义和意义
- 定义
泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)
- 泛型的意义
- 适用于多种数据类型执行相同的代码(代码复用)
- 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
- 泛型的特性
泛型只在编译阶段有效
1 | java复制代码@Test |
通过上面的例子可以证明,在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出(泛型擦除/类型擦除),并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。
二、泛型的使用
- 一些常用的泛型类型变量
E:元素(Element),多用于java集合框架
K:关键字(Key)
N:数字(Number)
T:类型(Type)
V:值(Value)
- 泛型的约束
- 不能实例化泛型类型变量
- 静态变量或方法不能引用泛型类型变量,但是静态泛型方法是可以的
- 基本类型无法作为泛型类型
- 无法使用instanceof关键字或==判断泛型类的类型
- 泛型类的原生类型与所传递的泛型无关,无论传递什么类型,原生类是一样的
- 泛型数组可以声明但无法实例化
- 泛型类不能继承Exception或者Throwable
- 不能捕获泛型类型限定的异常但可以将泛型限定的异常抛出
1 | java复制代码/** |
泛型的主要使用包括 泛型类,泛型接口,泛型方法 三种形式
- 泛型类
1 | java复制代码//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 |
注意:
- 泛型的类型参数只能是类类型,不能是简单类型(8种基本类型)
- 在使用泛型类的时候,不一定要传入泛型类型实参, 如果不传入泛型类型实参的话,在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型
- 泛型接口
泛型接口与泛型类的定义及使用基本相同。泛型接口常被用在各种类的生产器中,可以看一个例子:
1 | java复制代码//定义一个泛型接口 |
当实现泛型接口的类,未传入泛型实参时:
1 | java复制代码/** |
当实现泛型接口的类,传入泛型实参时:
1 | java复制代码/** |
- 泛型方法
1 | java复制代码/** |
泛型方法举例
1 | java复制代码public class GenericTest { |
- 泛型通配符
泛型通配符的种类:
一. <? extends T> 指定了泛型类型的上界
- 用于方法形参,限定只能传T以及T的子类
- 用于父类引用 ,主要用于安全地访问数据,可以访问 T 及其子类型,并且只能写入null
二. <? super T> 指定了泛型类型的下界
- 用于方法形参,限定只能传T以及T的父类
- 用于父类引用 ,主要用于安全地写入数据,可以写入Child及其子类型
三. <?> 指定了没有限制的泛型类型
- 用于方法形参,无任何限制,可以传任何类型
- 用于父类引用 ,只能写入null
1 | java复制代码/** |
三、参考链接
本文转载自: 掘金