一句话弄懂Java泛型 extends 和 super

之前一直用有道笔记,记录的东西都是只要自己看得懂就行了,现在尝试写文章,发表一下自己的一点点见解,可能有很多不足之处
废话不多说,开始正文

<? 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);       // 子类的子类   报错

根据注释可以看出,得出一句话:

<? extends E> 向下兼容子类及其子孙类
<? super E> 向上兼容父类及其祖类
  • 9
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值