无界通配符之间是否有区别,例如<?>
和一个有界通配符,其边界为 Object
,例如<? extends Object>
?
我记得在某处读到过,泛型的早期草案有所不同,但再也找不到那个来源了。
最佳答案
对于大多数人来说,<? extends Object>
与 <?>
相同,就像每个人在这里建议的那样。
但是,它们在两个非常细微的点上有所不同:
JVMS(Java 虚拟机规范)对无界通配符有一个特殊规范,如
ClassFileFormat-Java5
指定无界通配符编码为*
, 而将对象有界通配符编码为+Ljava/lang/Object;
.此类更改将通过任何分析字节码的库泄漏。编译器编写者也需要处理这个问题。来自 revisions to "The class File Format"从 reifiblity 的角度来看,它们是不同的。 JLS 4.6 and 4.7编纂
List<?>
作为可具体化的类型,但List<? extends Object>
作为删除类型。任何添加.isReifiable()
的库作者(例如 mjc lib )需要考虑到这一点,以遵守 JLS 术语。来自 JLS 4.6 and 4.7 .
关于java - Java中的无界通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2016017/