<?>和<? extends Object>的区别
<?>和<? extends Object>的区别
蚂蚁的世界 发表于3年前
<?>和<? extends Object>的区别
  • 发表于 3年前
  • 阅读 1106
  • 收藏 8
  • 点赞 0
  • 评论 2

腾讯云 技术升级10大核心产品年终让利>>>   

From a practical point to most people, <? extends Object> is the same as <?>, like everyone have suggested here.

However, they differ in two very minor and subtle points:

  1. The JVMS (Java Virtual Machine Specification) has a special specification for the unbounded wildcards, as ClassFileFormat-Java5 specifies that unbounded wildcard gets encoded as *, while encodes a Object-bounded wildcard as +Ljava/lang/Object;.  Such change would leak through any library that analyzes the bytecode.  Compiler writers would need to deal with this issue too.  From revisions to "The class File Format"

  2. From reifiablity standpoint, those are different.  JLS 4.6 and 4.7 codify List<?> as a reifiable type, but List<? extends Object> as a erasured type.  Any library writer adding .isReifiable() (e.g. mjc lib) needs to account for that, to adhere to the JLS terminology.  From JLS 4.6 and 4.7.


这个解释超牛逼,先把它记下来。它来自于http://stackoverflow.com/questions/2016017/unbounded-wildcards-in-java/2016382#2016382

update:

以下是我翻译的,求指点。

从使用它的角度来看,<? extends Object>和<?>是一样的,就像每个人所建议的。
尽管如此,他们有两个细微的区别:
1,JVMS 对无界通配符有个特定的规范,ClassFileFormat-Java5的规范是,无界通配符将被编码成*,而以Object为上界的通配符(? extends Object)将被编码成+Ljava/lang/Object。这个区别在类库分析字节码时会带来一个漏洞。编译器编写者将不得不处理这个问题;可参照 revisions to "The class File Format"。
2,从可信赖的角度看,它们是不同的。JLS4.6和4.7认为 List<?>是一个可信赖的类型,但是List<? extends Object>是会被擦除掉的类型。任何库的编写者在考虑这个问题时需要使用.isReifiable(),以拥护JLS所倡导的思想。

共有 人打赏支持
粉丝 6
博文 25
码字总数 7187
评论 (2)
西夏一品堂
求翻译
蚂蚁的世界

引用来自“西夏一品堂”的评论

求翻译
我更新了博文,贴上了自己的翻译。
×
蚂蚁的世界
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: