泛型通配符extends与super的区别

<? extends T>限定参数类型的上界:参数类型必须是T或T的子类型

<? super T> 限定参数类型的下界:参数类型必须是T或T的超类型

总结为:

  1. <? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入
  2. <? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收
  3. ? 既不能用于入参也不能用于返参

示例:

class Super{  }

class Self extends Super{  }

class Son extends Self{  }         

List<? extends Self> a = new ArrayList<>();// 参数类型上界是Self
        // a.add(new Son());//error
        // 不能放入任何类型,因为编译器只知道a中应该放入Self的某个子类,但具体放哪种子类它并不知道,因此,除了null以外,不能放入任何类型
        // a.add(new Self());//error
        // a.add(new Super());//error
        a.add(null);// ok

        Self s1 = a.get(0); // 返回类型是确定的Self类,因为<? extends T>
                            // 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入
        Super s2 = a.get(0); // Self类型可以用Super接收
        // Son s3 = a.get(0); //error:子类不能接收父类型参数

        List<? super Self> b = new ArrayList<>();// 参数类型下界是Self
        b.add(new Son());// ok 只能放入T类型,且满足T类型的超类至少是Self,换句话说,就是只能放入Self的子类型
        b.add(new Self());// ok 本身类型也可以
        // b.add(new Super());//error 超类不可以
        b.add(null);// ok
        Object o1 = b.get(0);// 返回类型是未知的, 因为<? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收
        // Son o2 = b.get(0);//error
        // Self o3 = b.get(0);//error

        // Super o4 = b.get(0);//error

原文链接https://www.cnblogs.com/yepei/p/6591289.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值