该领域是模糊的,而它显然是隐藏的

时间:2013-07-02 16:02:24

标签: java hide constants ambiguity

我知道并完全同意通过接口共享常量被视为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" ...

1 个答案:

答案 0 :(得分:3)

根据JLS 9.3

  

如果接口继承了两个具有相同名称的字段,例如,它的两个直接超接口声明具有该名称的字段,则会产生一个不明确的成员。使用这个不明确的成员将导致编译时错误。

CONSTANT中的字段SubClassConstants隐藏了CONSTANT SuperClassConstants。但是类SubClass可以访问CONSTANT,因为它实际上实现了两个接口。

您可以通过指定接口名称来删除歧义:

System.out.println(SubClassConstants.CONSTANT);

另请阅读JLS 6.5.6.1

  

如果表达式名称由单个标识符组成,那么在标识符出现的位置必须只有一个声明表示局部变量,参数或字段可见(第6.4.1节)。否则,发生编译时错误。