Java 中的无界通配符
2022-09-02 11:26:52
无界通配符之间是否存在差异,例如 和绑定为的有界通配符,例如 ?<?>
Object
<? extends Object>
我记得在某处读到,泛型的早期草案存在差异,但再也找不到那个来源了。
无界通配符之间是否存在差异,例如 和绑定为的有界通配符,例如 ?<?>
Object
<? extends Object>
我记得在某处读到,泛型的早期草案存在差异,但再也找不到那个来源了。
从实际的角度来看,对大多数人来说,是一样的,就像大家在这里建议的那样。<? extends Object>
<?>
但是,它们在两个非常小和微妙的点上有所不同:
JVMS(Java 虚拟机规范)对无界通配符有一个特殊规范,因为指定未绑定通配符编码为 ,而将对象限定通配符编码为 。此类更改将通过分析字节码的任何库泄漏。编译器编写者也需要处理这个问题。从修订到“类文件格式”ClassFileFormat-Java5
*
+Ljava/lang/Object;
从可信赖性的角度来看,这些是不同的。JLS 4.6 和 4.7 编纂为可重用类型,但编码为擦除类型。任何添加的库编写器(例如mjc lib)都需要考虑到这一点,以遵守JLS术语。从 JLS 4.6 和 4.7 开始。List<?>
List<? extends Object>
.isReifiable()
作为一个点,如果类/接口/构造函数/方法声明了一个边界(除了 ),则存在差异。extends Object
interface Donkey<T extends Thing> { }
...
Donkey<? extends Object> foo; // FAIL