1. 概述
泛型是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式<数据类型>;
,泛型只支持引用数据类型。
2. 好处
统一数据类型、把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常。
3. 使用
泛型可以在很多地方进行定义:泛型类、泛型方法、泛型接口。把出现泛型变量的地方全部替换成真实传输的数据类型。
3.1 自定义泛型类
定义类同时定义了泛型的类就是泛型类。泛型类的格式:
//修饰符 class 类名<泛型变量>
public class MyArrayList<T>{}
/** 此处泛型变量T可以随便写为任意标识,常见的如:E、T、K、V
编译阶段可以指定数据类型,类似于集合的作用**/
3.2 自定义泛型方法
方法中可以使用泛型接受一切实际类型的参数,方法更具备通用性。
//修饰符<泛型变量> 方法返回值 方法名称(形参列表){}
public<T>void show(T t){}
public static<T> void printArray([]arr){
if(arr!=null){
StringBuilder sb = new StringBuilder("[");
for(int i = 0;i<arr.length;i++){
sb.append(arr[i]).append(i==arr.length-1 ? "":",");
}
ab.append("]")
}else {
System.out.println(arr);
}
}
String[] names = {"小明","小东","小红"};
Integer[] ages = {10,20,30};
printArray(names);
printArray(ages);
3.3 自定义泛型接口
使用了泛型定义的接口就是泛型接口,可以让实现类选择当前功能需要操作的数据类型。实现类可以在实现接口的时候传入自己的操作数据类型,这样重写的方法都将是针对于该类型的操作。
public interface Data<E>{}
public interface Data<E>{
void add(E e);
void delete(int id);
E queryById(int id);
}
public class TeacherData implements Data<Teacher>{
@Override
public void add(Teacher teacher){};
@Override
public void delete(int id){};
@Override
public Teacher queryById(){
return null;
};
}
4. 泛型通配符:?
? 可以在“使用泛型”的时候代表一切类型;ETKV是在定义泛型的时候使用的。
4.1 泛型的上下限
public static void go(ArrayList<? extends Car> cars){};
?extends Car
:?必须是Car或者其子类,泛型上限
?super Car
:?必须是Car或者其父类,泛型下限