调用SuperInterface默认方法来覆盖实现SubInterface

时间:2016-12-16 16:26:48

标签: java inheritance interface

package org.my.site;

interface BaseInterface {
    default void f() {
        System.out.println("default Base.f()");
    }
}

interface DerivedInterface extends BaseInterface {
//  default void f() {
//      System.out.println("default Derived.f()");
//  }
}

public class DefaultExample implements DerivedInterface {

    @Override
    public void f() {

        DerivedInterface.super.f();
    }

    public static void main(String[] args) {
        new DefaultExample().f();
    }
}

虽然DerivedInterface中没有重写的默认方法(因此它在上面的代码片段中被注释),但输出是:

default Base.f()

但是如果我取消注释并且默认方法f()在DerivedInterface中给出了新代码,则行" DerivedInterface.super.f();"工作不同。输出是:

default Derived.f()

为什么呢?我可以从我的班级访问BaseInterface.f()吗?我能够做到这一点,直到我重新定义它......

此外,我并不完全理解" DerivedInterface.super.f();"线路工作和为什么"超级" (DerivedInterface.super。)有效......

我不能从班级中引用BaseInterface这是真的吗?我的意思是" BaseInterface.super.f();"给出错误"无法绕过更具体的直接超类DerivedInterface"。

在这个answer中,它说如何从类中重写方法调用接口默认方法(但是层次结构很简单:类扩展接口)。在我的代码行" BaseInterface.super.f();"给出错误"无法绕过更具体的直接超类DerivedInterface"。

在另一个article(它的部分"多重继承?")中,当两个不同的接口(不相互扩展 - 没有层次结构!)同时由一个类(然后I1.super.f()和I2.super.f()在重写类中的f()方法的代码中工作)。我的情况不同,因为I2扩展了I1,而类只实现了I2。所以I1.super.f()给出错误!

0 个答案:

没有答案