特别是,在编译/运行时发生了什么,在接口不一致的情况下会产生错误?
示例接口:
public interface Interface1 {
int NUM = 0;
}
public interface Interface2 {
int NUM = 1;
}
这有一个编译错误:
public class Test implements Interface1, Interface2 {
public static void main(String[] args) {
System.out.println(NUM);
}
}
运行正常:
public class Test implements Interface1, Interface2 {
public static void main(String[] args) {
System.out.println("anything");
}
}
当java遇到NUM
时,它从接口中查找定义。它不能同时检查这两个,所以为什么不使用Interface1
的定义(首先实现的)?它的设计是为了检查所有接口的一致性吗?
本质上,你在这里得到的是菱形问题- Interface1
有一个字段,Interface2
有一个字段。它们都在它们的实现类中使用,但哪一个"获胜"是未定义的。如果Interface1.NUM
是100,Interface2.NUM
是1000呢?那么行为会是怎样的呢?如果行为不一致怎么办——有时在运行过程中变为100,有时变为1000?
对于哪个NUM
是"首先"定义的,这是不明确的。没有关于哪个接口实际上被接受为序列中的"第一个"接口的规范。Java对实现的了解不够,无法信任其中一个实现,所以它放弃了——这两个实现都太模糊了,无法让运行时做出判断调用。