为什么Java编译器(特别是它的解析器)不能理解这个语句

One*_*ree 18 java

我有以下两个类(在两个单独的文件中).

public class Foo
{
    public static class A
    {
        public static final boolean FLAG = false;
    }

    public final A A = new A();
}


public class Bar
{
    void method()
    {
         if (Foo.A.FLAG)  <<<< this is giving "Cannot make static ref to non-static field
            // do something
           ;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么编译器不能记录通过Foo.A,我的意思是类A,而不是成员,这也恰好被命名A

Sot*_*lis 27

这称为模糊,Java的一个模糊特征/限制

一个简单的名称可能出现在上下文中,它可能被解释为变量,类型或包的名称.在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包.因此,有时可能无法通过其简单名称引用可见类型或包声明.我们说这样的声明是模糊的.

如果变量Astatic,它将编译,因为您可以访问static对象引用上的成员.


FLAG没有初始化.