Java - <? extends T>與<? super T>區(qū)別

示例類的繼承關(guān)系如下所示:

class A1 {}

class A2 extends A1 {}

class A3 extends A2 {}

class A4 extends A3 {}

1. <? super T>

<? super T> 表示類型下界,表示參數(shù)化類型是此類型的超類型(父類型),直至 Object

// 示例代碼
List<? super A3> mylist1 = new ArrayList<>();
mylist1.add(new A3());
mylist1.add(new A4());
mylist1.add(new A2());  // compile error
mylist1.add(new A1());  // compile error

A3 temp1 =  mylist1.get(0);     // compile error

當(dāng) T 表示為 A3 類型時(shí),插入 A3A4 實(shí)例是可以的,因?yàn)?A4A3 子類。但是插入 A2A1 實(shí)例就會報(bào)錯(cuò),因?yàn)闊o法接收 A3 的父類實(shí)例。

另外,A3 temp1 = mylist1.get(0); 也會報(bào)錯(cuò),因?yàn)楂@取到的元素?zé)o法得知是 A3 的哪個(gè)父類。

2. <? extends T>

<? extends T> 表示類型的上界,表示參數(shù)化類型可能是 TT 的子類。

// 示例代碼
List<? extends A3> mylist2 = new ArrayList<>();
mylist2.add(new A4());      // compile error
mylist2.add(new A3());      // compile error
mylist2.add(new A2());      // compile error
mylist2.add(new A1());      // compile error

A3 temp2 = mylist4.get(0);

當(dāng) T 表示為 A3 類型時(shí),A3 的子類是不確定的,所以無法插入元素。但是 A3 temp2 = mylist4.get(0); 是可以獲取的,因?yàn)楂@取到的肯定是 A3A3 的子類類型。

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

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

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