来源: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 中,我们需要通过覆盖冲突的方法来手动解决它:
要解决此问题,在 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();
}
}