我知道并完全同意通过接口共享常量被视为bad practice,但我没有选择此实现。无论:
interface SuperClassConstants {
public static final String CONSTANT = "super";
}
interface SubClassConstants extends SuperClassConstants {
public static final String CONSTANT = "sub";
}
class SuperClass implements SuperClassConstants {
}
class SubClass extends SuperClass implements SubClassConstants {
public SubClass() {
System.out.println(CONSTANT);
// The field CONSTANT is ambiguous
}
}
为什么含糊不清?这个常数不是隐藏的吗?我以为Java会理解我期待"sub"
...
答案 0 :(得分:3)
根据JLS 9.3:
如果接口继承了两个具有相同名称的字段,例如,它的两个直接超接口声明具有该名称的字段,则会产生一个不明确的成员。使用这个不明确的成员将导致编译时错误。
CONSTANT
中的字段SubClassConstants
隐藏了CONSTANT
SuperClassConstants
。但是类SubClass
可以访问CONSTANT
,因为它实际上实现了两个接口。
您可以通过指定接口名称来删除歧义:
System.out.println(SubClassConstants.CONSTANT);
另请阅读JLS 6.5.6.1:
如果表达式名称由单个标识符组成,那么在标识符出现的位置必须只有一个声明表示局部变量,参数或字段可见(第6.4.1节)。否则,发生编译时错误。