Java泛型与高阶应用

218 阅读2分钟

今天我们来聊聊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;

}