目录
1.场景
代码中存在大量的通用型强制类型转换时,如Object,可用泛型代替。用于结构与方法相同但类型不同的类,避免冗余方法的产生。
2.创建
使用大写字母,常用E表示集合,K、V表示键和值,T、U、S表示任意类型。有多个类型时,用逗号隔开。
泛型类
调用时同样尖括号在类名后
@Data
@AllArgsConstructor
public class Pair<T,U> {
private T first;
private U second;
}
泛型方法
泛型方法即可以在泛型类中创建,也可在普通类中创建。对于后者,要在返回值前放尖括号,调用时放方法名前,通常可根据赋值判断而省略。
public static <S> S getMid(S[] arr){
return arr[arr.length/2];
// System.out.println(Arrays.toString(arr));
}
3.类型限定
规定使用的类型必须使用某个接口,如果有多个接口需要继承,用 & 隔开,如果有标签接口,即没有方法的接口,如Serializable,需放在末尾。
public static <S extends Comparable<S> int minus(S a, S b){
return a.compareTo(b);
}
4.局限性
1.T不能用基本类型,如int,用封装类型代替,如Integer
2.无法用instanceof查询泛型类
3.不能创建泛型类的数组,不过可用ArrayList代替
4.使用T...obj 代替T[] 会得到警告但可以运行,但没必要
5.不能使用new T(),一定要用就提供构造器表达式Supplier
6.不能声明private static T 变量
7.不能抛出或捕获异常,如extends exception 或者catch(T e)
5.泛型类的继承问题与通配符
当Manager是Employee的子类,Pair<Manager>与Pair<Employee>没有任何关系。
也就是说,Pair<Manager>的对象不能赋给Pair<Employee>,但可以用通配符解决问题。
用“? extends ”来表示一个更大的集合。可以有get方法,但set不行。
Pair<? extends Employee> employee=new Pair<Manager>(obj1,obj2);
超类型限定
用" ? super Manager " 表示,与extends相反,可以有set方法,但不能get