Java 中的无界通配符

2022-09-02 11:26:52

无界通配符之间是否存在差异,例如 和绑定为的有界通配符,例如 ?<?>Object<? extends Object>

我记得在某处读到,泛型的早期草案存在差异,但再也找不到那个来源了。


答案 1

从实际的角度来看,对大多数人来说,是一样的,就像大家在这里建议的那样。<? extends Object><?>

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

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

  2. 从可信赖性的角度来看,这些是不同的。JLS 4.6 和 4.7 编纂为可重用类型,但编码为擦除类型。任何添加的库编写器(例如mjc lib)都需要考虑到这一点,以遵守JLS术语。从 JLS 4.6 和 4.7 开始List<?>List<? extends Object>.isReifiable()


答案 2

作为一个点,如果类/接口/构造函数/方法声明了一个边界(除了 ),则存在差异。extends Object

interface Donkey<T extends Thing> { }

...
    Donkey<? extends Object> foo; // FAIL

推荐