私有静态字段在被周围的类限定时是否可以从嵌套类中看到?

mis*_*ico 5 java annotations inner-classes

我正在清理代码并更改对静态成员的所有访问权限,以便它们由定义它们的类限定.然而,这导致了以下困扰我的问题.

我有一个带有嵌套类的类.在这个嵌套类的注释中,我引用了周围类中的私有静态final字段.当这样做没有资格时(如下面D类的注释),这是有效的.但是,在添加类限定符时(如在类C上的注释中),编译器会告诉字段(下面的v)不可见.

public class VisibilityTest {

    @interface A {
        int f();
    }

    @A(f = VisibilityTest.v) //fails
    private static class C {
        int c = VisibilityTest.v; //works
    }

    @A(f = v) //works
    private static class D {
        int d = VisibilityTest.v; //works
    }

    private final static int v = 5;

}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,变量都指向同一个字段,为什么会发生这种情况呢?

biz*_*lop 4

这可以与 1.8.0_25 和 1.7.0_45 很好地编译javac,因为它确实应该如此。或者两者都应该失败,这也将是一致的。

这似乎是 Eclipse 注释处理中的一个错误(这就是为什么您可以愉快地从正常代码引用相同的常量),很久以前就报告了它,但在过去 4 年里没有太多活动。