【问题标题】:The field is ambiguous while it is clearly hidden该领域是模糊的,而它显然是隐藏的
【发布时间】:2013-07-02 16:02:24
【问题描述】:

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

【问题讨论】:

  • 但是您的SubClass 类可以访问这两个接口...

标签: java hide constants ambiguity


【解决方案1】:

根据JLS 9.3

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

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

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

System.out.println(SubClassConstants.CONSTANT);

另请阅读JLS 6.5.6.1

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

【讨论】:

    猜你喜欢
    • 2012-04-19
    • 2011-04-16
    • 1970-01-01
    • 2017-12-14
    • 2012-08-31
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多