在 Java 8 中使用具有相同签名的两个默认方法实现两个接口

新手上路,请多包涵

假设我有两个接口:

 public interface I1
{
    default String getGreeting() {
        return "Good Morning!";
    }
}

public interface I2
{
    default String getGreeting() {
        return "Good Afternoon!";
    }
}

如果我想同时实现它们,将使用什么实现?

 public class C1 implements I1, I2
{
    public static void main(String[] args)
    {
        System.out.println(new C1().getGreeting());
    }
}

原文由 kavai77 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 339
2 个回答

这是一个编译时错误。您不能从两个接口有两个实现。

但是,它是正确的,如果您在 --- 中实现 --- C1 getGreeting 方法:

 public class C1 implements I1, I2 // this will compile, bacause we have overridden getGreeting()
{
    public static void main(String[] args)
    {
        System.out.println(new C1().getGreeting());
    }

    @Override public String getGreeting()
    {
        return "Good Evening!";
    }
}

我只是想补充一点,即使 I1 中的方法是抽象的,而 I2 中的默认方法,你也不能同时实现它们。所以这也是一个编译时错误:

 public interface I1
{
    String getGreeting();
}

public interface I2
{
    default String getGreeting() {
        return "Good afternoon!";
    }
}

public class C1 implements I1, I2 // won't compile
{
    public static void main(String[] args)
    {
        System.out.println(new C1().getGreeting());
    }
}

原文由 kavai77 发布,翻译遵循 CC BY-SA 3.0 许可协议

这不是特定于问题的。但是,我仍然认为它为上下文增加了一些价值。作为@toni77 的回答的补充,我想补充一点,可以从实现类调用默认方法,如下所示。在下面的代码中,默认方法 getGreeting() 来自 interface I1 从重写方法调用:

 public interface I1 {
     default String getGreeting() {
        return "Good Morning!";
     }
}

public interface I2 {
    default String getGreeting() {
        return "Good Night!";
    }
}

public class C1 implements I1, I2 {
    @Override
    public String getGreeting() {
        return I1.super.getGreeting();
    }
}

原文由 Keerthivasan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题