来自https://dzone.com/articles/interface-default-methods-java
Java 8 引入了“默认方法”或(Defender 方法)新特性,它允许开发人员向接口添加新方法,而不会破坏这些接口的现有实现。它提供了允许接口定义实现的灵活性,该实现将在具体类无法为该方法提供实现的情况下用作默认值。
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public class ClassAB implements A {
}
当人们第一次听说新功能时,有一个关于默认方法的常见问题:
如果该类实现了两个接口并且这两个接口都定义了具有相同签名的默认方法怎么办?
举例说明这种情况:
public interface A {
default void foo(){
System.out.println("Calling A.foo()");
}
}
public interface B {
default void foo(){
System.out.println("Calling B.foo()");
}
}
public class ClassAB implements A, B {
}
此代码无法编译,结果如下:
java: class Clazz inherits unrelated defaults for foo() from types A and B
为了解决这个问题,在 Clazz 中,我们必须通过覆盖冲突方法来手动解决它:
public class Clazz implements A, B {
public void foo(){}
}
但是如果我们想从接口 A 调用方法 foo() 的默认实现而不是实现我们自己的呢?
可以按如下方式引用 A#foo():
public class Clazz implements A, B {
public void foo(){
A.super.foo();
}
}