示例类的继承关系如下所示:
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
的子类类型。
网友评论