java解决默认方法冲突
出现默认方法冲突的原因,如果先在一个接口中将一个方法定义为默认方法,之后又在另一个接口中定义了同样的方法,就会产生二义性。java解决二义性的规则如下:
1)超类优先:如果超类提供了一个具体方法,同名且有相同参数参数类型的默认方法会被忽略。
2)接口冲突:如果一个超类接口提供了一个默认方法,另一个接口也提供了一个同名且参数类型(无论是否是默认参数)相同的方法。必须覆盖这个方法来解决冲突。
假设接口A和B都有默认方法b()
public interface A {
default void b() {
System.out.println("a");
}
}
public interface B {
default void b() {
System.out.println("b");
}
}
类C同时实现了这两个接口,然而这两个接口有同样的默认方法b(),这时候就会出现接口冲突,必须要求我们在C中提供一个b()方法解决这种冲突。
public class C implements A, B {
@Override
public void b() {
A.super.b();
}
public static void main(String[] args) {
C c = new C();
c.b();
}
}
3)类优先:一个类扩展了一个超类,同时实现了一个接口,并从超类和接口同时继承了相同的方法。在这种情况只是考虑超类的方法,接口中的所有默认方法会被忽略。
千万不要让一个默认方法重新定义Object类中的某个方法。因为类优先的原则,接口中的方法一定会被忽略的