概述
集合中的泛型
集合中存在什么样的安全隐患
- 集合默认可以存储任意类型的对象。
- 当在存储String的集合中,存储一个Integer类型,调用String类型的特有方法就会报错,导致程序崩溃。
集合中泛型的使用
- 创建集合使用泛型指定集合只能存放的数据类型。
- 遍历集合时不需要进行类型转换。
泛型的好处(优点)
- 增强了集合安全性,把运行时的错误转为编译时错误。
- 省去了类型强转的麻烦。
注意事项
- 在泛型中没有多态的概念,要不左右两边的数据类型要保持一致,要不只写一边。推荐两边都写一样的。
- 泛型不准使用基本数据类型,如果需要使用基本数据类型,要使用基本数据类型对应的包装类。
泛型方法
需求
定义一个方法,方法可以接收任意类型的参数,方法返回值类型要和实际参数的类型一致。
泛型概述
- 泛型变量可以理解为数据类型的占位符。
- 泛型变量还可以理解为数据类型的变量。
泛型变量的命名规范
只要是一个合法的标识符就可以,一般使用一个大写字母表示
泛型 | 描述 |
---|---|
T | Type |
E | Element |
K | key |
V | value |
什么是泛型方法
- 方法声明上使用了泛型变量的方法就是泛型方法。
泛型方法的格式
权限修饰符 <泛型变量> 返回值类型 方法名(参数列表) {}
泛型方法的须知
泛型变量的具体数据类型是什么取决于传递的参数类型。
泛型类
需求
- 一个方法可以接收任意类型的数组,将数组元素进行反转
- 一个方法可以接收任意类型的数组,将数组元素拼接成字符串返回
什么是泛型类
- 在类上使用了泛型变量的类
泛型类的格式
class 类名<泛型变量>{}
泛型类的使用方式
-
在创建泛型类对象时需要指定泛型变量的具体数据类型
泛型类名<具体的数据类型> 变量名 = new 泛型类名<具体的数据类型>()
-
如果在创建泛型类的对象时没有指定泛型变量的具体数据类型,则默认是Object
-
静态方法上不能使用类定义的泛型变量,如果要使用,则需要将该方法定义泛型方法,由该方法自己定义泛型变量。
泛型接口
需求
- 增删改查用户信息
什么是泛型接口
- 使用了泛型变量的接口就是泛型接口
泛型接口的格式
interface 接口名<泛型变量>{}
泛型接口的实现方式
-
实现接口的同时指定泛型变量的具体数据类型。
-
不够灵活,无法在创建对象时修改泛型变量的数据类型了。
例:public class 类名 implements 接口名<Student>{}
-
-
实现接口时不指定泛型的具体数据类型,由使用者在使用实现类时指定泛型变量的具体数据类型。(推荐使用)
-
比较灵活,可以在创建对象时指定泛型变量的具体数据类型。
例:public class 类名<T> implements 接口名<T>{}
-
泛型上下限
需求1
- 定义一个方法可以接收任意类型的集合对象
- 集合对象只能存储Integer或者是Integer的父类数据。
需求2
- 定义一个方法可以接收任意类型的集合对象
- 集合对象只能存储Number或者是Number的子类数据。
泛型的通配符
- ? 匹配任意类型数据,不需要定义就可以使用。
- 不能用来定义泛型方法和泛型类,泛型接口
- 一般?不会单独使用,一般会结合泛型上下限使用
泛型下限
? super Integer 只能传递Integer或Integer的父类类型
泛型上限
? extends Number 只能传递Number或Number的子类类型
泛型数组
-
在不确定数组的大小时使用
int[] i=new int[...];
-
完全可以用Arraylist取代