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

2022-08-31 14:54:00

假设我有两个接口:

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());
    }
}

答案 1

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

但是,如果实现中的方法,则它是正确的:getGreetingC1

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());
    }
}

答案 2

这不是特定于该问题的。但是,我仍然认为它为上下文增加了一些价值。作为对@toni77答案的补充,我想补充一点,可以从实现类调用默认方法,如下所示。在下面的代码中,从重写的方法调用的默认方法 from: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();
    }
}