之前一直用有道笔记,记录的东西都是只要自己看得懂就行了,现在尝试写文章,发表一下自己的一点点见解,可能有很多不足之处
废话不多说,开始正文
<? extends E> 上限通配符,用来限制类型的上限
<? super E> 下限通配符,用来限制类型的下限
先举几个类的例子:
基类: A
A的子类: A1, A2
A的孙子类(A1的子类): B
B的子类: B1
B的子孙类(B1的子类): C
先写一个泛型类如下
public class Demo<E> {
public void extendsTest(List<? extends E> list){
System.out.println("extendsTest ok");
}
public void superTest(List<? super E> list){
System.out.println("superTest ok");
}
}
然后写一个段测试代码:
Demo<B> tt2 = new Demo<>();
List<A> aList1 = new ArrayList<>();
List<A1> a1List1 = new ArrayList<>();
List<A2> a2List1 = new ArrayList<>();
List<B> bList1 = new ArrayList<>();
List<B1> b1List1 = new ArrayList<>();
List<C> cList = new ArrayList<>();
// extends 子类对象,使用继承基类的子类都能用
// 可以理解成向下兼容
// tt2 B类的对象
// tt2.extendsTest(aList1); // 基类的基类对象 报错
// tt2.extendsTest(a1List1); // 基类对象 报错
// tt2.extendsTest(a2List1); // 基类的兄弟类对象 报错
tt2.extendsTest(bList1); // 自己对象 可用
tt2.extendsTest(b1List1); // 子类对象 可用
tt2.extendsTest(cList); // 子类的子类 可用
tt2.superTest(aList1); // 基类的基类 可用
tt2.superTest(a1List1); // 基类 可用
// tt2.superTest(a2List1); // 基类的兄弟类 报错
tt2.superTest(bList1); // 自己对象 可用
// tt2.superTest(b1List1); // 子类对象 报错
// tt2.superTest(cList); // 子类的子类 报错
根据注释可以看出,得出一句话: