文档章节

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

蚂蚁的世界
 蚂蚁的世界
发布于 2015/06/12 14:51
字数 383
阅读 1166
收藏 8
点赞 0
评论 2

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 ⋅ 1

关于java泛型?号

Map Map 这两者有什么区别?

NotFoundException ⋅ 2014/12/15 ⋅ 3

java “数组” 和 “ArrayList” 的区别

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

山如 ⋅ 05/17 ⋅ 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

Java 之泛型通配符 ? extends T 与 ? super T 解惑

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

永顺 ⋅ 2017/02/21 ⋅ 0

java当中annotation的用法

@Inherited @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface Demo { Class[] value() default {}; } default加与不加的区别是什么?......

开源艺龙 ⋅ 2015/12/09 ⋅ 1

class和 class类型 有什么区别

平时看java源代码的时候,如果碰到泛型的话,我想? T K V E这些是经常出现的,但是有时想不起来代表什么意思,今天整理下: ? 表示不确定的java类型。 T 表示java类型。 K V 分别代表java键...

Carbenson ⋅ 2016/10/27 ⋅ 0

Java 泛型中? super T和? extends T的区别

经常发现有List<? super T>、Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具...

皮蛋瘦肉粥里没有粥 ⋅ 2016/03/03 ⋅ 0

泛型通配符extends与super的区别

class Super{ } class Self extends Super{ } class Son extends Self{ } void test() { List<? extends Self> a = new ArrayList<>();//参数类型上界是Self a.add(new Son());//error 不能放......

丁佳辉 ⋅ 02/06 ⋅ 0

Java 多线程之 Runnable VS Thread 及其资源共享问题

对于 Java 多线程编程中的 implements Runnable 与 extends Thread,部分同学可能会比较疑惑,它们之间究竟有啥区别和联系呢?他们是不是没啥区别随便选呢?实际中究竟该选择哪一个呢? 甚至...

xrzs ⋅ 2015/07/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Netweaver和SAP云平台的quota管理

Netweaver 以需要为一个用户上下文(User Context)能够在SAP extended memory区域中分配内存尺寸创建quota为例。 对于Dialog工作进程,使用事务码修改参数 ztta/roll_extension_dia. 对于非D...

JerryWang_SAP ⋅ 13分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 22分钟前 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 46分钟前 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 52分钟前 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

Yii2中findAll()的正确使用姿势/返回为空的处理办法

从一次错误的操作开始 $buildingObject = Building::findAll("status=1"); 1 这个调用看着没有任何毛病,但是在使用时返回的结果却是一个空数组。再回过头来看看数据表中: 按照套路来讲,查...

dragon_tech ⋅ 今天 ⋅ 0

如何优雅的编程——C语言界面的一点小建议

我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则。我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化。可是,如果不是直到现在把它们写在纸上,长久以...

柳猫 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部