一、上界通配符
- 上界通配符
? extends T,表示 T 或 T 的任意子类型,只能读取,不能写入
java
List<? extends Number> list = new ArrayList<Integer>(List.of(1, 2, 3));
Number num = list.get(0); // 安全读取为 Number
java
// 不能写入 Integer 类型,因为无法确定具体类型,list 可能是 List<Integer>,也可能是 List<Double> 等
public void test_write(List<? extends Number> list) {
list.add(new Integer(100));
}
java
// 除了写入 null
public void test_write(List<? extends Number> list) {
list.add(null);
}
二、下界通配符
- 下界通配符,
? super T,表示 T 或 T 的任意父类型
java
List<? super Integer> list = new ArrayList<Number>();
list.add(new Integer(1)); // 安全,Integer 是 Number 子类
java
// 只能读取为 Object,因为无法确定具体类型,list 可能是 List<Integer>,也可能是 List<Number> 等
public void test_read(List<? super Integer> list) {
Object obj = list.get(0);
}
三、无界通配符
- 无界通配符,
?,表示任意类型,只读为 Object
java
// 不能写入,因为无法确定具体类型,list 可能是 List<Dog>,也可能是 List<Cat> 等
// 只能读取为 Object,因为无法确定具体类型,list 可能是 List<Dog>,也可能是 List<Cat> 等
void process(List<?> list) {
for (Object obj : list) {
}
}
PECS 原则
- PECS,全称 Producer Extends Consumer Super,用于指导泛型通配符的使用
-
Producer Extends:生产者,使用上界通配符作为返回类型
-
Consumer Super:消费者,使用下界通配符作为参数类型