导入静态没有包名称

考虑以下简单的代码示例:

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 staticTestStaticImport.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-“无法导入默认包的静态成员” – 有人可以解释一下这句话吗?