3

我知道并完全同意通过接口共享常量被认为是一种不好的做法,但我没有选择这种实现。任何:

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"......

4

1 回答 1

3

根据JLS 9.3

如果一个接口继承了具有相同名称的两个字段,例如,因为它的两个直接超接口声明了具有该名称的字段,那么就会产生一个不明确的成员。任何使用这个模棱两可的成员都会导致编译时错误。

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

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

System.out.println(SubClassConstants.CONSTANT);

另请阅读JLS 6.5.6.1

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

于 2013-07-02T16:05:18.177 回答