泛型的高级使用方式--受限泛型

泛型用来定义使用未知数据类型作为参数的方法和接口是非常好用,但是既然是泛型,就代表可接收的数据类型是任意的,没有严格要求,但是如果需要给泛型的类型给出明确的范围,又应该怎么操作呢?此时就应当为泛型设定限制——受限泛型,可以指定一个泛型的上限和下限。

泛型的上限:

  • 格式:类型名称 <? extends E> 对象名称
  • 意义:只能接收E类本身及其子类

泛型的下限:

  • 格式:类型名称 <? super E> 对象名称
  • 意义:只能接收E类型本身及其父类型

比如:现已知Object类,String类,Number类,Integer类,其中Number是Integer的父类

举个例子:

public static void main(String[] args){
    /*
    	类与类之间的继承关系
    	Integer extends Number
    	Numebr extends Object
    	String extends Object
    */
    Collection<Integer> list1 = new ArrayList<Integer>();
    Collection<String> list2 = new ArrayList<String>();
    Collection<Number> list3 = new ArrayList<Number>();
    Collection<Object> list4 = new ArrayList<Object>();
    
    getElement1(list1);
    getElement1(list2);//报错
    getElement1(list3);
    getElement1(list4);//报错
    
    getElement2(list1);//报错
    getElement2(list2);//报错
    getElement2(list3);
    getElement2(list4);
}
//泛型上限,调用该方法的参数必须是Number类型或者其 “子” 类型
public static void getElement1(Collection<? extends Number> s){}

//泛型下限,调用该方法的参数必须是Number类型或者其 “父” 类型
public static void getElement2(Collection<? super Number> s){}

其中报错为:

在这里插入图片描述

因为分析上方代码可以知道,getEle1方法在接受list2list4getEle2方法接收list1list2时,参数超过了方法中规定的数据类型的范围,因此会报错。StringObject都不是Number的子类,于Number也没有父子继承关系。IntegerString都不是Number的父类,故不在受限泛型内(上图为idea界面,红线部分为错误提示)。

日常开发中受限泛型不太常用,能做到拿到源码可以看懂其所表达的受限泛型的范围就可以了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值