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)
我的问题:
注意,这只是对生成代码中的实际问题的简化,其中com.example.X需要完全限定并且com不能重命名成员.
更新:我认为它实际上可能是类似这样的问题:为什么我不能在Java中"静态导入"一个"等于"方法?
一个简单的名称可能出现在上下文中,它可能被解释为变量,类型或包的名称.在这些情况下,§6.5的规则指定将优先选择变量而不是类型,并且将优先选择类型而不是包.因此,有时可能无法通过其简单名称引用可见类型或包声明.我们说这样的声明是模糊的.