Java 8 引入默认方法 http://cr.openjdk.java.net/~dlsmith/jsr335/jsr335-0.6.2/H.html提供扩展接口的能力,而无需修改现有的实现。
我想知道当该方法已被覆盖或由于不同接口中的默认实现冲突而不可用时,是否可以显式调用该方法的默认实现。
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 类的方法?
As per 本文 http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/您访问界面中的默认方法A
using
A.super.foo();
这可以按如下方式使用(假设接口A
and 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
and C
可以两者都有.foo()
可以选择方法和特定的默认实现,或者您可以使用其中一种(或两种)作为新方法的一部分foo()
方法。您还可以使用相同的语法来访问实现类中其他方法中的默认版本。
方法调用语法的正式描述可以在JLS第15章 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)