? super T

在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)。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容