Skip to content

Java 泛型的使用

TIP

泛型(Generics)提供了编译时类型安全检测机制,允许在编译时检测到非法的类型。

泛型类

java
// 定义一个泛型类
public class Box<T> {
    private T item;

    public void set(T item) {
        this.item = item;
    }

    public T get() {
        return item;
    }
}

// 使用
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String value = stringBox.get(); // 无需强转

Box<Integer> intBox = new Box<>();
intBox.set(123);

泛型方法

java
public class Utils {
    // 泛型方法,T 在方法返回类型前声明
    public static <T> T getMiddle(T[] arr) {
        return arr[arr.length / 2];
    }
}

String mid = Utils.getMiddle(new String[]{"A", "B", "C"});

类型通配符

java
// ? 无界通配符
public static void printList(List<?> list) {
    for (Object obj : list) {
        System.out.println(obj);
    }
}

// ? extends T 上界通配符
public static double sum(List<? extends Number> list) {
    double total = 0;
    for (Number n : list) {
        total += n.doubleValue();
    }
    return total;
}

// ? super T 下界通配符
public static void addNumbers(List<? super Integer> list) {
    list.add(1);
    list.add(2);
}

类型擦除

WARNING

Java 泛型是伪泛型,在编译时会进行类型擦除:

  • 泛型信息仅在编译阶段存在
  • 编译后的字节码中会替换为原始类型(Object 或上界)
  • 运行时无法获取到泛型的具体类型
java
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass() == list2.getClass()); // true