在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及其父類)
這種區(qū)分遵循了"PECS原則":Producer Extends, Consumer Super(生產(chǎn)者用extends,消費者用super)。