2017-02-14 73 views
3

在Java中,一个类只能扩展一个父类,但可以实现多个接口。 随着 引进用Java 8接口缺省方法,有一个类继承多于一个 方法具有相同签名的通过实现具有相同的默认方法 这可以创建金刚石问题如在C++Java8中钻石问题解决或多重继承的规则

2个接口的可能性

例在下面的代码

new C().hello(); is 

This is Second

public interface First { 

    default void hello(){ 
     System.out.println("This is First"); 
    } 
} 

public interface Second extends First { 

    default void hello(){ 
     System.out.println("This is Second"); 
    } 
} 

    public class MyClass implements First,Second { 

    public static void main(String[] args) { 
     new MyClass().hello(); 
    } 
} 

什么是Java使用可熔酚醛树脂的决议规则的输出钻石问题? 一个简单的答案,比如谁优先,什么时候会很棒。

+0

想知道很多。伟大你提出这个问题。 –

回答

2

你的代码片段没有钻石问题,因为接口第二次扩展接口并覆盖方法hello。

无需扩展接口第二编译器会引发错误

Duplicate default methods named hello with the parameters() and() are inherited from the types Second and First 
2

实现两个接口是声明相同的默认方法导致的编译错误:

MyClass inherits unrelated defaults for sayHi() from types InterfaceA and InterfaceB 

所以没有钻石的问题;)

要解决此问题,您可以重写实现类中的方法,并在其中实现它,或者推迟到正确的接口。

在你的情况下,它会看起来像(如果你想使用接口First的方法):

public class MyClass implements First,Second { 
    public void hello() { 
     First.super.hello(); 
    } 
} 
4

有解释对此进行了详细相当多的Oracle Tutorial

你基本上已经从第一个接口覆盖了你的方法,并选择了最具体的接口方法。

4

以下是当一个类继承的方法,从多个地方相同的签名(另一个类或接口)的规律可循:

  • 类总是赢。类或超类 中的方法声明优先于任何默认方法声明。
  • 否则,子接口win:选择在最具体的默认提供接口中具有相同签名的方法。 (例如在你的第二个接口的情况下,方法应该像第二个接口一样运行)。
  • 最后,如果选择仍不明确,则从多个接口继承的类必须通过覆盖它并明确调用所需的方法来显式选择要使用的默认方法实现。
+0

这正是我所寻找的。一个涵盖所有场景的非常精确的答案。谢谢!罗希特 –