为什么 JVM 规范声明接口必须有一个super_class
of java/lang/Object
,即使接口不扩展java/lang/Object
?
我特别指的是 JVM 规范的§4.1,它说:
对于接口,super_class 项的值必须始终是 constant_pool 表的有效索引。该索引处的 constant_pool 条目必须是表示类 Object 的 CONSTANT_Class_info 结构。
然而在JLS的 §9.2 中,它说接口不扩展 Object。而是声明了一个隐式创建的抽象方法,它匹配 Object 类中的每个公共方法:
如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法 m,其签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s、返回类型为 r 和 throws 子句的公共实例方法 m在 Object 中声明,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。