`
jobar
  • 浏览: 341076 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

缺省方法(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();
        }
    } 


冲突并不总是可以避免的。如果在上面的例子中,接口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/
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics