You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类继承两个override-equivalent方法为何未触发JLS编译错误?

关于Java默认方法与父类方法override-equivalent却未触发编译错误的疑问

根据《Java语言规范(第21版)》规则:若类C继承的一个默认方法与另一个继承方法签名为override-equivalent,且C的超类中无继承的、与这两个方法override-equivalent的抽象方法,则会触发编译错误。

给定如下Java代码:

interface I {
    default void m(List l) {
        System.out.println("I");
    }
}

class A {
    public void m(List<String> l) {
        System.out.println("A");
    }
}

public class B extends A implements I {
    public static void main(String[] args) {
        I x = new B();
        List list = null;
        x.m(list); // invokes impl in A
    }
}

类B继承了接口I的默认方法m(List),同时继承了父类A的m(List<String>),二者签名为override-equivalent(I中m的签名是A中m签名的subsignature)。按规则该代码应编译失败,但实际可正常编译。

疑问:为何该代码能编译?若这不是规则的反例,我的推理存在什么错误?

补充说明

  • 有观点认为B未继承I.m而是被A.m覆盖,但根据JLS《继承、覆盖与隐藏》章节的规则,B满足继承I.m的所有条件,A.m并未覆盖I.m。
  • 将I中的m改为抽象方法后代码无法编译,也能验证这一点。

注:本问题与超类方法和接口默认方法冲突解决的问题不同,后者关注超类方法覆盖接口默认方法的原因,而本问题聚焦于符合JLS错误条件却未触发编译错误的情况。

内容的提问来源于stack exchange,提问作者Mohamed Nasser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:51:00