precondition:
1.inteface A extended B,C,D;
2.A,B,C,D have same default method : default Object getById(Long Id){...};
user case:
1.class E implements A;
2.class E call default method getById, then which one will be called?
我很困惑。它超出了我的记忆。 ^_^
通常,您会收到有关接口中重复默认方法的错误。
但是,在此特定情况下,将调用子接口A.getByID()
中的默认方法,因为子接口A
覆盖其超接口中的默认方法。
如果重写类/接口中的默认方法,则该方法将优先于其超接口中的默认方法。
一般情况由 Java 语言规范涵盖。(基本上,这归结为:歧义是编译错误,但类中的抽象方法优先,并消除歧义。
8.4.8.4. 使用覆盖等效签名继承方法
一个类可以继承多个方法 覆盖等效签名 (§8.4.2(。
如果类 C 继承了具体方法,则为编译时错误 其签名与继承的另一个方法等效 由C.
如果类 C 继承默认方法,则为编译时错误 其签名与继承的另一个方法等效 由 C 表示,除非存在超类中声明的抽象方法 的 C 并由 C 继承,与两者覆盖等效 方法。
将调用接口 A 中存在的默认方法,因为它覆盖了其超级接口的行为。