JAVA 泛型通配符extends

9 篇文章 0 订阅

在java泛型中,? 表示通配符,代表未知类型,子类型限定< ? extends Object>表示上界通配符(Upper Bounds Wildcards),超类型限定< ? super Object>表示下界通配符。

通配符 与 T 的区别:

  1. T:作用于模板上,用于将数据类型进行参数化,不能用于实例化对象。 
  2. ?:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义。
  3. < T > 等同于 < T extends Object>
  4. < ? > 等同于 < ? extends Object>

上界通配符 子类型限定(? extends):

语句1:List<? extends Number>eList存放Number及其子类的对象,语句1取出Number(或者Number子类)对象直接赋值给Number类型的变量是符合java规范的。 

语句2:List<? extends Number>eList存放Number及其子类的对象,语句2取出Number(或者Number子类)对象直接赋值给Integer类型(Number子类)的变量是不符合java规范的。 


语句3:List<? extends Number>eList不能够确定实例化对象的具体类型,因此无法add具体对象至列表中,可能的实例化对象如下。

上界<? extends T>不能往里存,只能往外取

<? extends Number>会使往盘子里放东西的set( )方法失效。但取东西get( )方法还有效。

所以通配符<?>和类型参数的区别就在于,对编译器来说所有的T都代表同一种类型。比如下面这个泛型方法里,三个T都指代同一个类型,要么都是String,要么都是Integer。

public <T> List<T> fill(T... t);

但通配符<?>没有这种约束, <?>单纯的就表示:这里放了一个东西,是什么我不知道。所以<? extends Fruit>里什么都放不进去。

总结:上界类型通配符add方法受限,但可以获取列表中的各种类型的数据,并赋值给父类型(extends Number)的引用。因此如果你想从一个数据类型里获取数据,使用 ? extends 通配符。限定通配符总是包括自己。

使用类似<? extends Number>通配符作为方法参数时表示:

方法内部可以调用获取Number引用的方法。

例如:Number n = obj.getFirst();

方法内部无法调用传入Number引用的方法(null除外)。

例如:obj.setFirst(Number n);。

即一句话总结:使用extends通配符表示可以读,不能写。

使用类似<T extends Number>定义泛型类时表示:

泛型类型限定为Number以及Number的子类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值