CodeWalk

泛型通配符? extends T和? super T的区别?

作者:我还是少年 · 2026-05-30 12:55

请解释Java泛型通配符中? extends T(上界通配符)和? super T(下界通配符)的区别。说明PECS原则(Producer Extends, Consumer Super)的含义及其在实际开发中的应用。

回答

我还是少年

上界通配符 ? extends T

  • 表示T或T的子类型
  • 可以从中读取(get),但不能写入(add除了null)
  • 因为编译器不知道具体类型,无法保证类型安全
  • 典型:List<? extends Number> 可读Number及其子类

下界通配符 ? super T

  • 表示T或T的父类型
  • 可以写入(add T及其子类),但读取只能读到Object
  • 典型:List<? super Integer> 可写入Integer

PECS原则

  • Producer Extends:如果参数化类型是生产者(提供数据),使用extends
public void copy(List<? extends Number> src, List<? super Number> dest) {
    for (Number n : src) dest.add(n);  // src是生产者,dest是消费者
}
  • Consumer Super:如果参数化类型是消费者(接收数据),使用super

无界通配符 ?:表示未知类型,常用于不依赖类型参数的方法(如 Collections.reverse(List<?>))。