Java如何确定接口是否不一致



特别是,在编译/运行时发生了什么,在接口不一致的情况下会产生错误?

示例接口:

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对实现的了解不够,无法信任其中一个实现,所以它放弃了——这两个实现都太模糊了,无法让运行时做出判断调用。

最新更新