0%

泛型

泛型

泛型:一种可以去接收数据类型的数据类型

优势:约束添加到集合中的数据类型,减少类型转换

1
2
3
4
5
6
7
// 举例说明
// 创建对象时的泛型使用
ArrayList<Dog> arrayList = new ArrayList<Dog>();
// 推荐的简化写法:省略右侧类型
ArrayList<Dog> arrayList = new ArrayList<>();
// 遍历时使用
for (Dog dog : arrayList)

泛型介绍

可以在类声明时通过一个标识表示类中某个属性的数据类型,或者是某个方法的返回值的类型,或者是参数类型

1
2
3
// 泛型的声明,K,V表示类型
Interface interfaceName<T>{};
class className<T,V>{};

使用细节 :

  1. type需要是引用类型,不能是基本数据类型
  2. 在给泛型指定具体类型后,可以传入该类型或者其子类类型
  3. 泛型的使用
  4. 没有指定泛型,默认为Object类型

自定义泛型

自己写一个类或接口,添加一个泛型规则

泛型类
1
2
3
4
// 类使用泛型
class 类名<T,R...>{
成员
}

细节: 泛型标识符一般使用大写字母,可以有多个。 普通成员可以使用泛型 使用泛型的数组,不能初始化 静态方法中不能使用类的泛型 泛型类的类型,是在创建对象时确定的 如果在创建对象时没有指定类型,默认为Object

泛型接口
1
2
3
4
// 接口使用泛型
interface 类名<T,R...>{
成员
}

细节: 静态成员中不能使用泛型 泛型接口的类型,在继承或实现接口时确定

泛型方法
1
2
3
4
// 方法使用泛型
修饰符 <T,R...> 返回类型 方法名(参数列表){
方法体
}

细节: 1.泛型方法可以定义在普通类中,也可以定义在泛型类中 2.当泛型方法被调用时,类型会确定 3.可以使用类声明的泛型,也可以使用方法声明的泛型

泛型继承和通配符

  • 泛型不具备继承性

  • 通配符

1
2
3
<?> // 支持任意类型泛型
<? expands A>// 支持A类及A的子类,确定上限
<? super A>// 支持A类以及A类的父类,确定下限