从 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();
}
}