泛型的上届和下届 extends super

上界:
上界用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。如下面的代码:

出错的情况
Map<String, ? extends Object> map = new HashMap<String, Object>();

map.put("aaaa", "aaaaaa");

这里会出错,是因为extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。因此,实际的map对象的value类型,可能是Integer String Long 等等。而实际的map变量的value类型是不可预测的。假设实际的map的value类型是Integer,那么不就有问题了,因为万一是Integer的话,它无法存入String的。因此在编译器就报错了。


下界
下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。如下面的

Map<String, ? super Object> map = new HashMap<String, Object>();

map.put("aaaa", "aaaaaa");

这个时候就不会抱错了。

因为这个时候的value泛型类型可能是Object或者Object的父类,因此,你传String进去,肯定能包容这个value。


下界
下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。如下面的代码:


Map<String, ? super String> map = new HashMap<String, String>();

map.put("aaaa",new Object());
依然抱错。
原因类型,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。既然可能是指定类型的父类,理论上应该可以put父类,但是别忘了,如果实际的泛型类型是String,String x = new Object();(这句就肯定编译不成功),Object它不是String类型,自然不能put进去。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值