提问者:小点点

java如何克服多重继承和钻石问题


我正在尝试了解如何克服JAVA中的“钻石问题”,假设我有这3个接口:

interface Alpha{
    public default int methodA() {
        int result=0;
        System.out.println("Print from Alpha methodA");
        return result+4;
    }
}

//**********************************

interface Betta extends Alpha {
    public default int methodA() {
        int result=0;
        System.out.println("Print from Betta methodA");
        return result+8;
    }
}
//*******************************

interface Gamma extends Alpha {
    public default int methodA() {
        int result=0;
        System.out.println("Print from Gamma methodA");
        return result+16;
    }
}

还有那个班级:

public class Delta implements Betta,Gamma {
    public static void main(String args[]) {
    // TODO Auto-generated method stub

    Delta cObj=new Delta();
    cObj.methodA();
}

如何获得类Delta给我Alpha接口的输出?除了将其更改为“Delta实现Alpha”之外还有其他方法吗?


共2个答案

匿名用户

如果你在类Delta中实现Betta和Gamma,那么你必须在Delta中得到编译错误来覆盖默认方法。因为如果两个接口有相同的默认方法,那么实现两者的类必须定义自己的实现。

你可以这样做:

public class Delta implements Betta, Gamma {
    public static void main(String[] args) {
        Delta cObj = new Delta();
        cObj.methodA();
    }

    @Override
    public int methodA() {
        return Betta.super.callSuperMethodA();
    }
}

public interface Betta extends Alpha {

    public default int methodA() {
        int result = 0;
        System.out.println("Print from Betta methodA");
        return result + 8;
    }

    //Call this from Delta default method
    public default int callSuperMethodA() {
        return Alpha.super.methodA();
    }

}

匿名用户

你可以把阿尔法的方法变成静态的

public interface Alpha {
public static int methodA(){
    int result = 0;
    System.out.println("Print from Alpha methodA");
    return result+4;
}}

或者,您可以在Betta或Gamma中创建一个引用Alpha方法的方法。

第三个可选的解决方案是删除Gamma和Betta的默认实现,这意味着自动清空它们。