考虑以下因素:
//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 匿名实现?
您只能调用上一级的方法,因此您需要
Fooable.super.foo();
在
MyFooable
,而只是在 super.foo()
中呼叫
MyAdvancedFooable
您只需使用
super.foo()
或 this.super.foo()
,因为它是对象的父级,而不是 Fooable.super.foo()
所暗示的类的父级。
你可以
MyAdvancedFooable extends MyFooable implements Fooable
。然后创建另一个接口,例如AnotherFooable,如下
public interface AnotherFooable implements Fooable {
public default void foo() {
Fooable.super.foo();
}
}
public class MyAdvancedFooable extends MyFooable implements AnotherFooable {
@Override
public void foo() {
AnotherFooable.super.foo();
System.out.println("MyAdvancedFooable::foo");
}
}
@参见: 创建另一个界面