我正在编写代码,其中一个类实现了两个接口,这些接口恰好有两个具有相同名称的抽象方法和两个具有相同标识符的常量:
public class Test implements A,B {
public void doStuff() {}
public void make() {}
public static void main(String[] args) {
Test t=new Test();
System.out.println(A.VALUE);
System.out.println(B.VALUE);
//System.out.println(Test.VALUE);
//System.out.println(t.VALUE);
}
}
interface A { // implicitly abstract
int VALUE=11; // implicitly public static and final
void doStuff(); // implicitly public and abstract
}
interface B {
int VALUE=14;
void make();
void doStuff();
}
现在,我知道从 Java 7 开始,我不必担心名称冲突,就抽象方法而言(对吗??):我只是提供了一个合适的实现,我很好(所有共享的方法同名),所以我不会遇到类似多重继承的问题或“钻石”(我想这是我在使用 Java 8 时要处理的问题)。
但是,就常量而言,我注意到如果我实现了这两个接口并且不尝试访问 VALUE 字段,编译器不会抱怨。当我取消注释打印语句时,它会抱怨。
如何?这是正常行为吗?只有当我访问这些成员时我才会收到错误?
编辑我的意思是,当我尝试实现接口时,为什么编译器不警告我歧义?