在子接口或实现类中访问Java缺省方法

时间:2014-10-08 14:59:50

标签: java methods interface override default

我理解一个类是否覆盖默认方法,您可以按以下方式访问默认方法

interface IFoo {
    default void bar() {}
}

class MyClass implements IFoo {
    void bar() {}
    void ifoobar() {
        IFoo.super.bar();
    }
}

但是接口覆盖默认方法的情况又如何呢?父方法是否可用?

interface IFoo {
    default void bar() {}
}

interface ISubFoo extends IFoo {
    // is IFoo.bar available anywhere in here?
    default void bar {}
} 

class MyClass implements ISubFoo {
    // is IFoo.bar available anywhere in here too?

    public static void main(String[] args) {
        MyClass mc = new MyClass();
        mc.bar(); // calls ISubFoo.bar
    }
}

Java用于默认方法的措辞类似于类,否则会引起混淆/误导。子接口“继承”默认方法,并可以“​​覆盖”它们。因此,似乎IFoo.bar应该可以在某处访问。

1 个答案:

答案 0 :(得分:2)

您可以升级一级,因此IFoo.bar()IFoo.super.bar()的ISubFoo中可用。

interface IFoo {
    default void bar() {}
}

interface ISubFoo extends IFoo {
    // is IFoo.bar available anywhere in here?
    // Yes it is
    default void bar {
        IFoo.super.bar()
    }
} 

class MyClass implements ISubFoo {
    // is IFoo.bar available anywhere in here too?
    // Not it is not

    public static void main(String[] args) {
        MyClass mc = new MyClass();
        mc.bar(); // calls ISubFoo.bar
    }
}