缺省方法(3)-如何解决方法声明的冲突?

如何解决方法声明的冲突?
因为可以从多个接口继承,相同的缺省方法可以通过不同的路径继承。由于每个继承的默认方法提供了不同的实现,编译器需要一种方式从中做出选择。下面是它的工作模式:

(1)类总是优先。类或父类的声明优先级高于任何缺省的方法声明。
(2)否则,选择具有相同签名的最具体的默认提供接口的该方法。例如,根据以上规则下面的代码输出Hello World from B。
 public interface A {
default void hello() { System.out.println("Hello World from A"); }
}
public interface B extends A {
default void hello() { System.out.println("Hello World from B"); }
}
public class C implements B, A {
public static void main(String... args) {
new C().hello();
}
}

[img]http://www.lambdafaq.org/wp-content/uploads/DefaultResolution1.png[/img]
冲突并不总是可以避免的。如果在上面的例子中,接口B没有继承A,那么C将从无关接口继承与签名匹配的缺省的方法。编译的代码将产生错误信息:
class C inherits unrelated defaults for hello() from types A and B//类C从A和B中继承了不相关的缺省方法hello
reference to hello is ambiguous, both method hello() in A and method hello() in B match.//从A和B到hello的引用是二义性的,A中的hello和B中的hello都匹配。

注意,第一个错误将报告是否有一个调用到继承的默认方法。冲突必须通过重写来解决。如果需要的话,对继承方法之一可以使用新的语法X.super.m(...),其中X是超接口,m是其选择的方法:
public class C implements B, A {
public void hello() {
A.super.hello();
}
...
}

现在打印“Hello World from A”。注意这个语法只能用于解决冲突,不覆盖上面列出的两个主要规则。

原文链接:http://www.lambdafaq.org/how-are-conflicting-method-declarations-resolved/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值