在Java泛型中,? super T 表示下界通配符(Lower Bounded Wildcard),与 ? extends T(上界通配符)的作用相反。
它的含义是:匹配所有T类型及其父类类型(包括T的直接父类、间接父类,直至Object)。
举个例子:
// 定义类的继承关系
class Animal {}
class Mammal extends Animal {}
class Dog extends Mammal {}
// 使用下界通配符
List<? super Dog> list;
// 以下赋值都是合法的
list = new ArrayList<Dog>(); // T本身
list = new ArrayList<Mammal>(); // T的父类
list = new ArrayList<Animal>(); // T的间接父类
list = new ArrayList<Object>(); // 最终父类
使用场景与限制:
- 主要用于写入操作,可以安全地向集合中添加T类型及其子类的元素
- 从集合中读取元素时,只能确定是Object类型(需要强制转换才能得到更具体的类型)
例如:
List<? super Dog> dogs = new ArrayList<Mammal>();
dogs.add(new Dog()); // 合法,可以添加Dog类型
dogs.add(new Puppy()); // 合法,可以添加Dog的子类(假设Puppy extends Dog)
Object obj = dogs.get(0); // 只能获取到Object类型
Dog dog = (Dog) dogs.get(0); // 需要强制转换(有风险)
总结:
-
? extends T:适合"读取"场景,限制元素的上限(只能是T及其子类) -
? super T:适合"写入"场景,限制元素的下限(只能是T及其父类)
这种区分遵循了"PECS原则":Producer Extends, Consumer Super(生产者用extends,消费者用super)。