示例類的繼承關系如下所示:
class A1 {}
class A2 extends A1 {}
class A3 extends A2 {}
class A4 extends A3 {}
1. <? super T>
<? super T>
表示類型下界,表示參數化類型是此類型的超類型(父類型),直至 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
當 T
表示為 A3
類型時,插入 A3
和 A4
實例是可以的,因為 A4
是 A3
子類。但是插入 A2
和 A1
實例就會報錯,因為無法接收 A3
的父類實例。
另外,A3 temp1 = mylist1.get(0);
也會報錯,因為獲取到的元素無法得知是 A3
的哪個父類。
2. <? extends T>
<? extends T>
表示類型的上界,表示參數化類型可能是 T
或 T
的子類。
// 示例代碼
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);
當 T
表示為 A3
類型時,A3
的子類是不確定的,所以無法插入元素。但是 A3 temp2 = mylist4.get(0);
是可以獲取的,因為獲取到的肯定是 A3
或 A3
的子類類型。