在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();
这可以如下使用(假设接口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()
方法,可以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