Java8引入了default methods来提供扩展接口的能力,而无需修改现有的实现.

我想知道,当一个方法被重写或由于不同接口中的默认实现冲突而不可用时,是否可以显式调用该方法的默认实现.

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?
    }
}

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

推荐答案

按照this article,您可以使用以下命令访问接口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
    }
}

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

方法调用语法的正式描述可以在chapter 15 of the JLS中找到.

Java相关问答推荐

无法在Java中使用Curve secp 256 k1验证JWT

Java 8 RDX-如何设置单个选项卡标题文本的 colored颜色

是否可以从@ TrustMapping中删除特定方法的基路径?

在FML中删除关键帧动画

Springdoc Whitelabel Error Page with Spring V3

Java中后期绑定的替代概念

Intellij显示项目语言级别最高为12,尽管有java版本17 SDK

需要一个找不到的jakarta.sistence.EntityManager类型的Bean

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

确定Java中Math.Ranb()输出的上限

在运行MVN测试时,为什么构建失败,并显示了java.lang.ClassNotFoundException:java.net.http.HttpResponse?

PDFBox未加载内容

Java ArrayList的整数和数组的泛型

如何在代码中将行呈现在矩形前面?

在macOS上读取文件会导致FileNotFound,即使文件存在(并且具有权限)

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

为什么我的登录终结点不能被任何请求访问?

rest api服务 spring 启动中出现IllegalFormatConversionException

在不带instanceof或switch的java中记录模式