Java中的无界通配符

not*_*oop 19 java generics bounded-wildcard

无界通配符<?>和绑定通配符之间是否有区别Object,例如<? extends Object>

我记得曾经在某处看过,仿制药的早期草稿有所不同,但是找不到那个来源了.

not*_*oop 32

从实用的角度来看,对大多数人<? extends Object>来说<?>,就像每个人都在这里建议的一样.

但是,它们在两个非常微小和微妙的方面有所不同:

  1. JVMS(Java虚拟机规范)具有针对无界通配符的特殊规范,ClassFileFormat-Java5指定无界通配符被编码为*,同时将对象绑定通配符编码为+Ljava/lang/Object;.此类更改将通过任何分析字节码的库泄漏.编译器编写者也需要处理这个问题.从修订版到"类文件格式"

  2. 从再生性的角度来看,这些是不同的. JLS 4.6和4.7编纂List<?>为reifiable类型,但List<? extends Object>作为一个erasured类型.任何库编写者添加.isReifiable()(例如mjc lib)都需要考虑到这一点,以遵守JLS术语.从JLS 4.6和4.7.


Tom*_*ine 18

作为一个节奏点,如果类/接口/构造函数/方法声明一个绑定(除了extends Object)之外有区别.

interface Donkey<T extends Thing> { }

...
    Donkey<? extends Object> foo; // FAIL
Run Code Online (Sandbox Code Playgroud)

  • 该示例在javac 7中编译 (2认同)