该字段是模糊的,但它显然是隐藏的



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

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

根据JLS 9.3:

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

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

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

System.out.println(SubClassConstants.CONSTANT);

另请阅读JLS 6.5.6.1:

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

最新更新