我正在尝试了解如何克服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”之外还有其他方法吗?
如果你在类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的默认实现,这意味着自动清空它们。