为什么无法使用super关键字调用父接口的default方法
Java接口default方法调用编译错误原因说明
错误触发原因
你代码里报错的核心原因是super关键字的指向规则不符合预期:
- Java中无前缀的
super默认指代当前类的直接父类,你当前的WithDefinitionsImpl没有显式继承其他类,super指向的是java.lang.Object,而Object类中没有definedMeth()方法,所以触发编译错误。 - 额外的语法设计原因:Java允许一个类实现多个接口,多个接口可能存在同名的default方法,直接使用
super.方法名()的写法会让编译器无法定位你要调用的是哪个接口的默认实现,因此语法层面本身就不允许用这种方式调用接口的default方法。
修正方案
调用指定接口的default方法需要使用接口名.super.方法名()的显式指定写法,你只需要修改报错行的代码即可:
interface WithDefinitionsInter { default void definedMeth() { System.out.println("inside interface"); } } class WithDefinitionsImpl implements WithDefinitionsInter { public void definedMeth() { WithDefinitionsInter.super.definedMeth(); // 修正后无编译错误 System.out.println("inside class"); } } public class QuizDef { public static void main(String par[]) { WithDefinitionsInter withDef = new WithDefinitionsImpl(); withDef.definedMeth(); } }
修改后代码运行输出为:
inside interface inside class
内容的提问来源于stack exchange,提问作者Manish Bansal
相关产品推荐
相关产品推荐

