泛型通配符? extends T和? super T的区别?
请解释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<?>))。