为了账号安全,请及时绑定邮箱和手机立即绑定

Java泛型超级关键字

Java泛型超级关键字

白板的微信 2019-07-27 15:15:55
Java泛型超级关键字我读过这些话题仿制药.?超级T用“Super”关键字包围泛型不过,我似乎还是有点迷茫super关键词:当我们宣布这样的收藏时:List<? super Number> list = null;list.add(new Integer(0)); //this compileslist.add(new Object());//this doesn't compile应该是相反的吗?我们有一个包含(未知类型的)对象的列表,这些对象是Number..所以Object应该适合(因为它是Number),以及Integer不应该。相反的是出于某种原因。如果我们有以下代码static void test(List<? super Number> param) {     param.add(new Integer(2));}public static void main(String[] args) {     ArrayList<String> sList = new ArrayList<String>();     test(sList);            //will never compile, however...}编译上述代码是不可能的(我的理智表明这是正确的行为),但是基本的逻辑可以证明相反的情况:String is Object, Object is superclass of Number. So String should work.我知道这很疯狂,但这不是他们不允许的原因吗?<S super T>建筑?如果是,那为什么<? super T>是允许的吗?有人能帮我恢复这个逻辑链中缺失的部分吗?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

中的有界通配符List<? super Number>能捕捉Number以及它的任何一种超级类型。自Number extends Object implements Serializable,这意味着目前唯一被捕获的类型-可转换为List<? super Number>是:

  • List<Number>

  • List<Object>

  • List<Serializable>

注意你可以add(Integer.valueOf(0))到上述任何类型。但是,你不能 add(new Object())转到List<Number>或者是List<Serializable>,因为这违反了泛型类型安全规则。

因此,它是你真的可以add任何超型Number转到List<? super Number>这根本不是有界通配符和捕获转换的工作方式。你不能宣布List<? super Number>因为您可能想要添加一个Object更重要的是(你不能!);你这么做是因为你想加入Number对象(即它是Number),简单地说是List<Number>限制太大了。

参考文献

另见

  • 有效Java第二版,第28项:使用有界通配符来增加api的灵活性。

    • “果胶代表生产者-

      extends

      ,消费者-

      super

相关问题

  • 太多了,太少了,胸肌,

    new Integer(0)

    VS

    valueOf



查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 358 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号