小编典典

在 Java 中显式调用默认方法

all

Java 8
引入了默认方法来提供扩展接口的能力,而无需修改现有实现。

我想知道当该方法已被覆盖或由于不同接口中的默认实现冲突而不可用时,是否可以显式调用该方法的默认实现。

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

class B implements A {
    @Override
    public void foo() {
        System.out.println("B.foo");
    }
    public void afoo() {
        // how to invoke A.foo() here?
    }
}

考虑到上面的代码,你将如何A.foo()从 B 类的方法中调用?


阅读 79

收藏
2022-04-15

共1个答案

小编典典

根据本文A,您可以使用接口访问默认方法

A.super.foo();

这可以按如下方式使用(假设接口AC具有默认方法foo()

public class ChildClass implements A, C {
    @Override    
    public void foo() {
       //you could completely override the default implementations
       doSomethingElse();
       //or manage conflicts between the same method foo() in both A and C
       A.super.foo();
    }
    public void bah() {
       A.super.foo(); //original foo() from A accessed
       C.super.foo(); //original foo() from C accessed
    }
}

A并且C两者都可以有.foo()方法,并且可以选择特定的默认实现,或者您可以使用一个(或两个)作为新foo()方法的一部分。您还可以使用相同的语法来访问实现类中其他方法的默认版本。

方法调用语法的正式描述可以在JLS 的第 15
中找到。

2022-04-15