当周围的限定时,私有静态字段是否应该从嵌套 class 中可见?

Should a private static fields be visible from nested class when qualified by the surrounding one?

我正在清理代码并更改对静态成员的所有访问权限,以便它们符合定义它们的 class。然而,这导致了以下令我困惑的问题。

我有一个 class,里面有一个嵌套的 class。在此嵌套 class 的注释中,我引用了周围 class 中的私有静态最终字段。在没有资格的情况下执行此操作时(如下面 class D 的注释中所示),这是有效的。但是,当添加 class 限定符时(如 class 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;

}

在这两种情况下,变量都引用相同的字段,那么为什么会发生这种情况?

How to supply value to an annotation from a Constant java

基本上你不能。注释值必须是基元或字符串。您不能引用字段,无论是私有字段还是其他字段。

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

这似乎是 Eclipse 注释处理中的一个错误(这就是为什么您可以愉快地从普通代码中引用相同常量的原因),这是 reported 很久以前的事了,但已经不多了activity 过去 4 年。