一尘不染

显式调用Java中的默认方法

java

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类的方法调用?


阅读 363

收藏
2020-03-09

共1个答案

一尘不染

按照这篇文章,你在界面访问默认方法A使用

A.super.foo();

这可用于如下(假设接口A和C两个有默认的方法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()方法的一部分。你也可以使用相同的语法在实现类中的其他方法中访问默认版本。

2020-03-09