资讯专栏INFORMATION COLUMN

【Java】白话编译器对List<? extend T>和List<? super

Pines_Cheng / 3346人阅读

摘要:里面可能有五种情况只有警察只有匪徒有警察心的平民有匪徒心的平民或者两种平民混合。编译器是非常怕死的,对于给出这种类型声明的集合,它基于向上转型的原则,用最安全的方式去处理。

如果你不懂,可以不看的问题背景:
Java编译器会阻止对声明类型为List的集合的add操作;会阻止对声明类型为List的集合的get操作。
会有类似add(capture) can not be applied to T的错误提示
为什么编译器要这么做?

咦,你穿越到了CS的世界,你知道这个世界上有一个只能存放一种身份的人或者拥有共同身份的人的黑盒,有一个入口和出口,黑盒上贴了一张纸条,向外面的你提示了黑盒中的人的类型,当然据说黑盒中会有惊喜。

你还知道这个世界有下面几种身份的人:平民、警察、匪徒,警察和匪徒是拥有武器的平民,他们的身份高低相等但都大于平民,但是穿越到这个世界这么久,你还没有见过一个平民。
而且城里面还流传着一个可怕的都市传说:由于警察和匪徒手持不同的武器,当你把警察和匪徒放到黑盒的同一个空间中,他们就会Boom!甚至由于从小接受不同的教育,如果警察或者匪徒穿上对立身份的衣服见到阳光,他们也会立刻Boom!
天啊,太可怕了!这些疯子!你无奈的摇摇头。

有一天,别人给你一个黑盒,上面贴着一张纸条“里面的人的身份大于等于平民”。送礼的人传给你一句话:“盒子里面的人实在是太酷了,拥有顶级装备,而且每一个进入这个黑盒的人都会变得很酷”。作为一个无可救药的小人爱好者,你很纠结。里面可能有五种情况:只有警察、只有匪徒、有警察心的平民、有匪徒心的平民、或者两种平民混合。对于前两种情况,你只能塞对应的警察或者匪徒进去;对于后三种情况,你可以安心的放任意警察或者匪徒进去。看着一柜子的普通人偶,你有点心动,但问题是:在真正放进一个警察或者匪徒进去前,你永远不知道这个黑盒会不会Boom!为了防止发生薛定谔的悲剧,你发誓永远不往这个黑盒中塞东西。但是你抑制不住心中的好奇,希望把黑盒中的人都拿出来看看,为了不Boom,你只能用平民的方式把黑盒里的人拿出来,你安慰自己,至少能看看平民长什么样子吧。好吧,这是你在这个世界见到的第一个平民。

又过了一天,别人又给你一个黑盒,上面又贴着一张纸条“里面的人的身份小于等于平民”。送礼的人传给你一句话:“盒子里面有一个人身上或者装备上有财宝”。你很纠结,里面可能有三种情况:有警察心的平民、有匪徒心的平民、或者两者都有,根据上一次的坑爹经验,你已经知道平民倍受歧视,上面啥都没有;问题是你不知道里面具体的是警察还是匪徒,警察不可能变成匪徒拿出来,匪徒也不可能变成警察拿出来,否则就会Boom!是搏一搏?你知道你很怂,所以你艰难的把黑盒的出口用胶水封存了。想到这个黑盒把自己的心情搞得一团糟,你气愤的把上次取出来的平民人偶全部塞进黑盒,扔出窗外。

PS:编译器是非常怕死的,对于给出这种类型声明的集合,它基于“向上转型”的原则,用最安全的方式去处理。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67282.html

相关文章

  • 六个Python编程最受用的内置函数使用详解

      小编写这篇文章的话,主要是给大家做出一个解答,解答一些Python常见问题,比如关于编程函数的一些问题,哪些函数编程是最受用的呢?下面就给大家详细介绍一下。  合理的使用Python这门工具,能够大大的提高其工作效率,起到事半功倍的作用。  1.Map函数  map函数可以使用另外一个函数转换整个可迭代对象的函数,包括将字符串转换为数字、数字的四舍五入等等。  之所以使用map函数来完成这些事...

    89542767 评论0 收藏0
  • 【LC总结】Iterator题目&lt;Zigzag 1&2&gt;&lt;BST&gt;&

    摘要:方法直接查找数组的位的迭代器,调用方法得到的整数即为要返回的元素。再写迭代器的方法返回指针元素的并让指针通过递归方法指向下一个元素。 Zigzag Iterator Problem Given two 1d vectors, implement an iterator to return their elements alternately. Example Given two 1d ...

    WelliJhon 评论0 收藏0
  • &lt;T extends Comparable&lt;? super T&gt;&gt;

    摘要:首先这是运用了的泛型后面跟的类型如任意字符类接口表示泛型的上限编译正确这里因为是的子类所以通过如果改为就会报错这样就限制了上限同样的表示泛型的下限这里来分析表示任意字符名,对泛型上限进行了限制即必须是的子类,然后表示中的类型下限为这样来看一

    BWrong 评论0 收藏0
  • &lt;java核心技术&gt;读书笔记2

    摘要:如果需要收集参数化类型对象,只有使用警告这节讨论,向参数可变的方法传递一个泛型类型的实例。异常不能抛出或捕获泛型类的实例实际上,泛型类扩展也是不合法的。 Object:所有类的超类 java中每个类都是由它扩展而来,但是并不需要这样写:class Employee extends Object.如果没有明确指出超类,Object类就被认为是这个的超类。可以使用Object类型的变量引用...

    jimhs 评论0 收藏0
  • 应用Python脚本制作获取基因组测序指定位置编码序列

    此篇文章关键给大家介绍了应用Python脚本制作获取基因组测序指定位置编码序列的实例详细说明,感兴趣的小伙伴值得借鉴参考一下,也希望能有一定的帮助,祝愿大家多多的发展,尽早涨薪  前言  在基因组分析中,大家常常会有这样一个要求,便是在一个fasta文件中获取某些编码序列出去。有时候这种编码序列注定是完备的编码序列,而有时候只是为原fasta文件中某一段编码序列中的一部分。尤其是当信息量许多时,应...

    89542767 评论0 收藏0

发表评论

0条评论

Pines_Cheng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<