如何从另一个子类调用默认接口方法?

时间:2017-05-01 12:11:39

标签: java multiple-inheritance default-method

请考虑以下事项:

//Fooable.java
public interface Fooable {
    public default void foo() {
        System.out.println("Fooable::foo");
    }
    //Lots of other non-default methods...
}

//MyFooable.java
public class MyFooable implements Fooable {
    @Override
    public void foo() {
        System.out.println("MyFooable::foo");
    }
    //implements other methods in Fooable...
}

//MyAdvancedFooable.java
public class MyAdvancedFooable extends MyFooable {
    @Override
    public void foo() {
        Fooable.super.foo();
        System.out.println("MyAdvancedFooable::foo");
    }
    public static void main(String[] args) {
        new MyAdvancedFooable().foo();
    }
}

如您所见,我想从foo()Fooable的子类)MyAdvancedFooable中致电MyFooable。但是,当我尝试编译时,我收到以下错误:

MyAdvancedFooable.java:4:错误:不是封闭类:Fooable         Fooable.super.foo();

如果我尝试MyAdvancedFooable extends MyFooable implements Fooable,我会收到以下信息:

MyAdvancedFooable.java:4:错误:错误的类型限定符默认超级调用中的Fooable         Fooable.super.foo();   方法foo()在MyFooable

中被覆盖

如何在不创建Fooable的新匿名实现的情况下解决此问题?

2 个答案:

答案 0 :(得分:2)

您只能调高一级方法,因此您需要

Fooable.super.foo();
MyFooable中的

,只需在super.foo()

中调用MyAdvancedFooable

答案 1 :(得分:0)

您只需使用super.foo()this.super.foo(),因为它是对象的父级而不是Fooable.super.foo()隐含的类。