java - 在 Java 中显式调用默认方法

标签 java inheritance interface java-8 default-method

Java 8 引入 default methods提供扩展接口(interface)而不需要修改现有实现的能力。

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

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您使用

访问接口(interface) A 中的默认方法
A.super.foo();

这可以如下使用(假设接口(interface)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() 方法,并且可以选择特定的默认实现,也可以使用一个(或两者)作为新 foo() 方法的一部分。您还可以使用相同的语法来访问实现类中其他方法的默认版本。

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

关于java - 在 Java 中显式调用默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19976487/

相关文章:

java - 如何模拟 Maven 插件环境和/或项目配置

c# - 从基定义初始化子类

C# : interface : same method in 2 interfaces

java - Java中的数组左旋转

java - 跟踪文档位置变化

java - 如何修改 Cursor 导致 IllegalArgumentException : column '_id' does not exist

java - JPA - InheritanceType.Joined 生成错误的表

c# - ViewModel 类应该实现 INotifyPropertyChanged 还是我可以使用对象组合?

java - 如何使用枚举实现接口(interface),接口(interface)扩展 Comparable?

c++ - C++ 中的抽象类(接口(interface))数组