文档章节

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

蚂蚁的世界
 蚂蚁的世界
发布于 2015/06/12 14:51
字数 383
阅读 1191
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

visualVm 中的 visual GC说明

visual GC 不是 visualVM 自带的,需要安装插件。 步聚:菜单栏 (Tools) - > plugins - > Avaiable Plugins 中就选择安装 Spaces: 各个分代的内存使用情况。 特别说明:风格有分灰色部分,...

Canaan_
昨天
1
0
学习设计模式——生成器模式

1. 认识生成器模式 1. 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 2. 组成: Builder:生成器接口,定义创建一个Product对象所需要的各个组件的操作,...

江左煤郎
昨天
0
0
C语言精要(第二章:基本数据类型)

2.1 C语言基本数据类型 在计算机术语中,把⼆进制数中的某⼀位数又称为⼀个⽐特(bit)。⽐特这个单位对于计算机⽽⾔,在度量上是最⼩的单位。除了⽐特之外,还有字节(byte)这个术语。⼀个...

ryanliue
昨天
0
0
实现下拉菜单多选框效果

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><li>工作意愿地:<%-- <c:forEach items="${list}" var="list"><input type="checkbox" value="${list......

lanjian28
昨天
1
0
scala的视图界定

在上一篇帧子的代码中,如果main函数中不是用字符串而是用数字则程序不能正常编译: class Pair[T <: Comparable[T]](val first:T,val second:T) //类型T必须要是Comparable接口的子类(即...

whoisliang
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部