如何完全限定包名与本地成员名冲突的类?

Luk*_*der 4 java visibility jls java-7

好的,这里是JLS专家的一个非常好奇的Java 7语言谜题.以下代码不能用javac和Eclipse编译:

package com.example;

public class X {
    public static X com = new X();

    public void x() {
        System.out.println(com.example.X.com);
        // cannot find symbol  ^^^^^^^
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎成员com完全阻止com.*从内部访问包X.然而,这并未得到彻底应用.以下工作,例如:

public void x() {
    System.out.println(com.example.X.class);
}
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 这种行为如何从JLS中证明是正确的?
  • 我该如何解决这个问题

注意,这只是对生成代码中的实际问题的简化,其中com.example.X需要完全限定并且com不能重命名成员.

更新:我认为它实际上可能是类似这样的问题:为什么我不能在Java中"静态导入"一个"等于"方法?

Sot*_*lis 6

这称为模糊(jls-6.4.2).

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