【问题标题】:How to call default interface method from another subclass?如何从另一个子类调用默认接口方法?
【发布时间】:2017-09-28 20:35:00
【问题描述】:

考虑以下几点:

//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();
    }
}

如您所见,我想从MyAdvancedFooableMyFooable 的子类)调用Fooable 中的foo()。但是,当我尝试编译时,出现以下错误:

MyAdvancedFooable.java:4:错误:不是封闭类:Fooable Fooable.super.foo();

如果我尝试MyAdvancedFooable extends MyFooable implements Fooable,我会得到以下信息:

MyAdvancedFooable.java:4: error: bad type qualifier Fooable in default super call Fooable.super.foo(); 方法 foo() 在 MyFooable 中被覆盖

如何在不创建新的 Fooable 匿名实现的情况下解决此问题?

【问题讨论】:

    标签: java multiple-inheritance default-method


    【解决方案1】:

    你只能调用上一级的方法,所以你需要

    Fooable.super.foo();
    

    MyFooable 中,而只是在MyAdvancedFooable 中调用super.foo()

    【讨论】:

      【解决方案2】:

      您只需要使用super.foo()this.super.foo(),因为它是对象的父对象,而不是Fooable.super.foo() 所暗示的类的父对象。

      【讨论】:

      • OP 想从接口调用foo() 方法。您的解决方案将改为调用 MyFooable 中的方法
      猜你喜欢
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2014-08-08
      • 2022-01-23
      相关资源
      最近更新 更多