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

问题描述 投票:0回答:3

考虑以下因素:

//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 匿名实现?

java multiple-inheritance default-method
3个回答
3
投票

您只能调用上一级的方法,因此您需要

Fooable.super.foo();

MyFooable
,而只是在
super.foo()
 中呼叫 
MyAdvancedFooable


0
投票

您只需使用

super.foo()
this.super.foo()
,因为它是对象的父级,而不是
Fooable.super.foo()
所暗示的类的父级。


0
投票

你可以

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");
    }
}

@参见: 创建另一个界面

© www.soinside.com 2019 - 2024. All rights reserved.