导入静态没有包名称
考虑以下简单的代码示例:
public class TestStaticImport { static enum Branches { APPLE, IBM } public static void doSomething(Branches branch) { if (branch == APPLE) { System.out.println("Apple"); } } }
如果我们将尝试编译此代码,我们将收到错误消息:
java: cannot find symbol symbol: variable APPLE location: class TestStaticImport
这可以通过引入此enum
静态导入来解决:
import static
… TestStaticImport.Branches.*
但是在这个时刻(对我来说)难以理解的事情开始了:
这个解决方案工作正常,一切都很好编译,直到类TestStaticImport
将被移动到空的根包,即没有任何
package blablabla;
在这个java文件的顶部;
代码行: import static TestStaticImport.Branches.*;
在我的Intellij IDEA中突出显示为有效代码(IDE的名称无关紧要,仅供参考),但当我尝试编译此类代码时出现以下错误:
java: package TestStaticImport does not exist
所以,实际上有两个问题:
1) 主要问题 :为什么无法从空目录import static
?
2)除了静态导入之外,允许在枚举字段中仅使用其名称(即APPLE
而不是Branches.APPLE
)进行代码引用的另一种方式(如果存在)是什么?
PS请不要告诉我,空包装是丑陋的风格等等。 这个问题只是理论问题。
Java语言规范禁止从未命名的包导入任何内容:
未命名包中的类型(第7.4.2节)没有规范名称,因此在每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型,以及(b)静态成员无法导入未命名包中的类型 因此,§7.5.1,§7.5.2,§7.5.3和§7.5.4都要求在未命名的包中导入类型(或其静态成员)的任何尝试都有编译时错误。
在古代,Java发明者不得不将Java类型映射到文件,因此编译器可以做一些真正的工作。 他们决定将包映射到文件夹,将类型映射到文件。 这非常有效。 它特别为新人设定了情感背景:“我恨你。不要惹我。” 但我离题了。
但是,默认包是一个问题,因为它没有一个定义良好的文件夹。 如果你有软件包com
,你知道某个文件夹是com
,但是默认软件包的文件夹名称是什么?
所以设计师决定import
和默认包不混合。 实际上,当您尝试导入没有包的任何东西时,您会收到错误(即import TestStaticImport
而没有static
, *
也会失败)。 请参见如何从默认包导入类
所以问题不是静态导入,而是您尝试从默认包导入。
与Java中的其他一些极端情况一样,没有解决方案。
另见: 在Java-“无法导入默认包的静态成员” – 有人可以解释一下这句话吗?