extends和super泛型限定符

本文解析了Java泛型中的<? extends T>与<? super T>的区别及使用场景,通过具体示例说明了上界通配符与下界通配符的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.上不存下不取

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

2.<? extends T>

List<? extends Number> eList = null;
eList = new ArrayList<Integer>();
Number numObject = eList.get(0);  //语句1,正确
Integer intObject = eList.get(0);  //语句2,错误
eList.add(new Integer(1));  //语句3,错误

因为语句1中,eList 中存的都是Number或者Number的子类,所以用Number肯定是能接住的
但是由于对象的实例化是不确定的,所以用Integer接就不行了,毕竟eList 中是有可能存在Number类型的
至于语句3,因为add是一个很动态的过程,有可能add一个Number的父类,不像get,是一个可控的,里面有的数据类型已经确定。所以有上不存的说法。

3.<? super T>

List<? super Integer> sList = null;
sList = new ArrayList<Number>();
Number numObj = sList.get(0);  //语句1,错误
Integer intObj = sList.get(0);  //语句2,错误
sList.add(new Integer(1));  //语句3,正确

语句1中,eList中存的都是Integer或者Integer的父类,所以除非用Object,否则无法接住里面的数据。
语句2中同理,因为只规定了下界,没规定上界,java中是是支持向上转型的,父类引用可以子类对象
语句3,因为eList中存的都是Integer或者Integer的父类,所以我添加Integer或者Integer的子类,都是可以添加进去的,因为他们都可以被Integer或者Integer的父类引用所接受。但是如果添加Integer的父类,仍然会报错

4.总结

上不存下不取
**<? extend A>**表明这个集合中存的都是A或者A的子类,所以用A或者Object是都可以接到的,但是add的话,万一add传了一个A的父类进去,就破坏了上界的目的,里面的数据类型也不符合预期了,所以干脆编译阶段就不能传任何类型进去。
**<? super A>**表明这个集合中存的都是A或者A的父类,没有规定一个最大的父类,所以只能用Obejct可以接到(按照上不存下不取的目的,其实这里也不应该取,但是取不会破坏数据,存会,所以这里没做限制,也是因为java中有个共同父类存在)。至于add,因为里面存的都是>=A的类,所以可以add任何<=A的类进去,add一个非A或者非A子类的类进去,还是会报错(可以理解为对add比get要严格)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

unhappy404

感谢老板打赏!!!爱您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值