我试图了解如何克服钻石问题"在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"?
之外的任何其他方式答案 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的默认实现,这意味着将它们全部清空。