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

时间:2017-01-03 12:05:03

标签: java interface extends implements diamond-problem

我试图了解如何克服钻石问题"在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 个答案:

答案 0 :(得分:0)

如果您在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();
    }

}

答案 1 :(得分:0)

您可以将Alpha的方法转为静态

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的默认实现,这意味着将它们全部清空。