Java8使用一个接口在另一个接口中实现方法

Java8使用一个接口在另一个接口中实现方法,java,inheritance,java-8,Java,Inheritance,Java 8,抱歉,如果重复,我不知道这个问题的正确术语,所以我没有发现有人问类似的问题 我有两个接口。比如说狗和宠物。 宠物有一个游戏的方法,这是抽象的。 犬科动物不延伸宠物。不过它有一个默认的播放方法,与宠物的播放方法签名相匹配 Dog是一个同时实现犬科和宠物的类。 狗想使用狗的默认游戏方法 我将如何干净地实施这一点?我唯一能看到的就是如果我做了这样愚蠢的事 class Dog implements Canine, Pet{ public Dog(){ } @Override

抱歉,如果重复,我不知道这个问题的正确术语,所以我没有发现有人问类似的问题

我有两个接口。比如说狗和宠物。 宠物有一个游戏的方法,这是抽象的。 犬科动物不延伸宠物。不过它有一个默认的播放方法,与宠物的播放方法签名相匹配

Dog是一个同时实现犬科和宠物的类。 狗想使用狗的默认游戏方法

我将如何干净地实施这一点?我唯一能看到的就是如果我做了这样愚蠢的事

class Dog implements Canine, Pet{
    public Dog(){
    }
    @Override
    public void play (String greeting) {
        Canine.super.play(greeting);
    }

}

interface Canine {
    default void play (String greeting) {
        System.out.println(greeting);
    }
}

interface Pet {
    void play (String greeting);
}

<>从我可以看出,在C++中,你可以声明一个类使用方法的默认实现,而不是在该类中实现它。在Java8中有没有类似的方法?

这已经是一种干净的方法了。为了更清楚一点,请检查以下程序的输出,其中
Dog extensed Animal
,该程序也有
play
方法,但在存在犬科的
默认play
方法时不会调用该方法

class Animal {
    public Animal() {
    }

    public void play(String greeting) {
        System.out.println("Before greeting in Animal");
        System.out.println(greeting);
        System.out.println("After greeting in Animal");
    }
}

class Dog extends Animal implements Canine, Pet {
    public Dog() {
    }

    @Override
    public void play(String greeting) {
        System.out.println("Before greeting in Dog");
        Canine.super.play(greeting);
        System.out.println("After greeting in Dog");
    }
}

interface Canine {
    default void play(String greeting) {
        System.out.println("Before greeting in Canine");
        System.out.println(greeting);
        System.out.println("After greeting in Canine");
    }
}

interface Pet {
    void play(String greeting);
}

public class Main {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.play("Hello");
    }
}
输出:

Before greeting in Dog
Before greeting in Canine
Hello
After greeting in Canine
After greeting in Dog

让犬科动物扩展宠物并从狗身上移除宠物界面。好吧,这只是一个例子,我用相对的名字替换了我正在处理的实际问题。我不能让狗扩展宠物,因为在这种情况下,狗和宠物无关,它只有一个共同的方法。狗既是犬科动物又是宠物,但犬科动物不是宠物。没有其他语法来表达这一特定意图。您的解决方案是规范解决方案。我不同意Holger的观点,拥有多个具有相同方法签名的接口将在以后导致问题。假设您对犬只和宠物的类型进行了if else块测试。逻辑将进行第一次检查,但您可能希望在该上下文中进行第二次检查。我认为这是一个设计缺陷,将来会成为维护的噩梦。