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

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

按照这篇文章你可以访问接口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()方法的一部分。 您也可以使用相同的语法来访问实现类中其他方法的默认版本。

下面的代码应该工作。

 public class B implements A { @Override public void foo() { System.out.println("B.foo"); } void aFoo() { A.super.foo(); } public static void main(String[] args) { B b = new B(); b.foo(); b.aFoo(); } } interface A { default void foo() { System.out.println("A.foo"); } } 

输出:

 B.foo A.foo 

您不需要重写接口的默认方法。 就像下面这样调用它:

 public class B implements A { @Override public void foo() { System.out.println("B.foo"); } public void afoo() { A.super.foo(); } public static void main(String[] args) { B b=new B(); b.afoo(); } } 

输出:

A.foo