泛型概述:
-
泛型:是jDk5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
-
泛型的格式:<数据类型>:注意:泛型只能支持引用数据类型。
-
集合体系的全部接口和实现类都是支持泛型的使用的。
泛型的好处:
-
统一数据类型
-
把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
泛型可以在很多地方进行定义:
类后面 泛型类 方法申明上 泛型方法 接口后面 泛型接口
泛型类的概述
-
定义类时同时定义了泛型的类就是泛型类。
-
泛型类的格式:修饰符 class 类名<泛型变量>()
-
此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等
-
作用:编译阶段可以指定数据类型,类似于集合的作用。
public class MyArrayList<E> { ArrayList<E> list = new ArrayList<>(); public void add(E e){ list.add(e); } public void remove(E e){ list.remove(e); } @Override public String toString() { return list.toString(); } }
泛型方法的概述
-
定义方法时定义了泛型的方法就是泛型方法。
-
泛型方法的格式:修饰符<泛型变量>方法返回值 方法名称(形参列表){}
public <T> void show(T t){}
作用:方法中可以使用泛型接受一切实际类型的参数,方法更具备通用性。
public static <T> void printArray(T[] arr){ // int String 的类型 if (arr != null){ StringBuffer sb = new StringBuffer("{"); for (int i = 0; i < arr.length; i++) { sb.append(arr[i]).append(i == arr.length -1 ? " ":","); } sb.append("}"); System.out.println(sb); }else { System.out.println(arr); } } }
泛型方法的原理
-
把出现泛型变量的地方全部替换成 传输的真实数据类型。
泛型接口的概述
-
使用了泛型定义的接口就是泛型接口。
-
泛型接口的格式:修饰符 interface 接口名称<泛型变量>{}
public interface Data<E>{ }
作用:泛型接口可以让实现类选择当前功能需要操作的数据类型
通配符:?
?可以在 “使用泛型” 的时候代表一切类型。
E T K V 是在定义泛型的时候使用的。
泛型的上下限
-
? extends Car:?必须是Car 或者其子类 泛型上限
-
? super Car : ? 必须是Car或者其父类 泛型下限