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()给出错误!