可以使用默认方法实现来实现基类中的抽象方法吗class

Can a default method implementation be used to implement an abstract method in a base class

如果我有一个带有抽象方法的class:

abstract class Base {
    abstract void foo();
}

和一个接口,它使用默认实现声明相同的方法:

interface Inter {
     default void foo() {
         System.out.println("foo!");
     }
}

我是否需要在 class 中提供一个实现 implements/extends 两者?

class Derived extends Base implements Inter {

}

这似乎应该可行,但我收到一个编译错误,指出 Derived 不是抽象的并且没有覆盖抽象方法 foo

我猜测 class 中的抽象方法比接口中的默认方法 "more important"。

有什么好的方法可以做到这一点吗?

我的根本问题是我有一个三级抽象 class 层次结构(AB 扩展 CDE extend F, C and F extend G), 这将有叶 classes 的多个实现。在每组实现中,有一些正在实现的通用方法定义在基础 classes 中,所以我希望写成

abstract class C extends G {
     abstract void foo();
     abstract void bar();
     abstract void quz();
     void baz() {
         foo();
         bar();
     }
}

abstract class A extends C {
    void quz() { /* impl */ }
}
abstract class B extends C {
    void quz() { /* different impl */ }
}

interface C1 {
     default void foo() { /* impl for first set of classes */ }
}
class A1 extends A implements C1 {
     @Override void bar() { ... }
     // foo implementation from C1
}
class B1 extends B implements C1 {
     @Override void bar() { ... }
}

interface C2 {
     default void foo() { /* impl for second set of classes */ }
}
class A2 extends A implements C2 {
     @Override void bar() { ... }
     // foo implementation from C2
}
class B2 extends B implements C2 {
     @Override void bar() { ... }
}

只需调用您具体的默认方法 class:

@Override
public void foo() {
    Inter.super.foo();
}