今天我们来聊聊Java开发中很强大但相对难度也较大的一个功能——泛型。
什么是泛型呢?用简单点说,泛型就是定义一种模板,可以适用于不同类型的数据。它可以帮助我们编写出更通用、灵活的代码。
不过,我们平时主要使用泛型时,更多的是基础用法,比如定义List或者Map。真正 unleash 泛型威力的,是它在高级应用中的表现力。
来,我分三章给大家介绍一下Java泛型高级应用的常见场景:
第一章:通用的接口
我们可以使用泛型来定义一个接口或者抽象类,这可以让实现这个接口的类都可以运用通用代码,且类型安全。
比如:
public interface Generator<T> {
T next();
}
class RandomGenerator implements Generator<Integer> {...}
第二章:限定泛型的类型
我们可以对泛型类型进行限定,比如只允许某一类型或者某一类型的子类型。这可以增加代码的安全性。
比如:
class Box<T extends Number> {
T value;
}
第三章:高级用法举例
比如多泛型,泛型限定其他泛型类型,以及隐式类型判断等。
第四章:泛型方法
我们可以将方法定义为泛型的,这样这个方法就可以在调用时接受任意类型了:
public class GenericMethods {
public static <T> T getFirst(List<T> list) {
return list.get(0);
}
}
第五章:上限通配符
利用上限通配符<? extend T>,可以让参数只接收指定类或其子类参数:
public void process(List<? extends Person> list){
//...
}
第六章:下限通配符
反过来,用<? super T>可以限定参数只能是指定类或其父类:
public void setPerson(List<? super Manager> list, Person p){
list.add(p);
}
第七章:自引用泛型
泛型类可以使用自己的泛型类型作为参数:
public class Node<T> {
private T data;
private Node<T> next;
}