文档章节

<?>和<? extends Object>的区别

蚂蚁的世界
 蚂蚁的世界
发布于 2015/06/12 14:51
字数 383
阅读 1183
收藏 8

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
博文 29
码字总数 7627
作品 0
昌平
程序员
加载中

评论(2)

蚂蚁的世界
蚂蚁的世界

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

求翻译
我更新了博文,贴上了自己的翻译。
西夏一品堂
西夏一品堂
求翻译
java8 super extend

public class A11 { void sa(){ System.out.println("A11"); } } public class A12 extends A11 { void sa(){ System.out.println("A12"); } } public class A13 extends A12 { void sa(){ S......

enjoyoschina
2017/10/07
61
1
关于java泛型?号

Map Map 这两者有什么区别?

NotFoundException
2014/12/15
293
3
java “数组” 和 “ArrayList” 的区别

面试官经常问这个问题,其实这有啥可问的,即使非要将两者放一起来问,也应该是问两者之间的联系,而不是区别。非问不可的话,区别当然是有的。 创建一个长度为10的Object 数组 Object [] ar...

山如
05/17
0
0
Map遍历的两种方式:keySet()、entrySet()

先上例子 Map<String, Object> map = new HashMap<String, Object>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); map.put("key4", "value4"); Set......

勤奋的蚂蚁
05/06
0
0
Java 之泛型通配符 ? extends T 与 ? super T 解惑

简述 大家在平时的工作学习中, 肯定会见过不少如下的语句: 我们都知道, 上面的代码时关于 Java 泛型的, 那么这两个不同的写法都有什么区别呢? 首先, 说到 Java 的泛型, 我们必须要提到的是J...

永顺
2017/02/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7月13日任务 for、while、break跳出、ontinue结束、exit退出

20.10 for循环 语法:for 变量名 in 条件; do …; done 案例1:计算1到100的和 #!/bin/bashsum=0for i in `seq 1 100`do    sum=$[$sum+$i]    echo $idoneecho $sum 案例2...

吕湘颖
39分钟前
0
0
qemu增量镜像的好处

可以快速恢复,相当于快照的功能。

simpower
46分钟前
0
0
Python3_Appium_QQ 实战

Python3_Appium实战 -海盐 APPium移动自动化测试 样例中 测试的 app 使用的是 QQ; Appium介绍 Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web 应用和混合...

海盐宝宝
46分钟前
0
0
内网穿透利器-ngrok的图文安装

使用场景: 在做微信开发或是调银行或支付宝等支付系统的时候,本地想联调但是对方需要可以访问的域名或是外网IP才可以。但是,在本地如果不在路由器上做映射或是公司没有固定的外网IP。这种...

中凯_凯哥java
51分钟前
4
1
归约与分组 - 读《Java 8实战》

区分Collection,Collector和collect 代码中用到的类与方法用红框标出,可从git库中查看 收集器用作高级归约 // 按货币对交易进行分组Map<Currency, List<Transaction>> currencyListMap = g...

yysue
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部