进口静态无包名(import static without package name)

2019-08-06 07:22发布

考虑下面的代码简单的例子:

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请不要告诉我,那空包装是丑陋的风格等等。 这个问题仅仅是理论问题。

Answer 1:

在Java语言规范禁止从命名的包的任何进口:

在未命名的包(第7.4.2节)A型没有规范的名称,因此对于每一种进口报关的规范名称的要求意味着,(a)在未命名的包类型不能进口,和(b)的静态成员在一个未命名的包类型不能被导入。 这样,第7.5.1节,第7.5.2节,第7.5.3节,和第7.5.4节都需要对任何企图在一个未指定的包导入类型(或其静态成员)一个编译时间错误。



Answer 2:

在古代,Java的发明人必须Java类型映射到文件,以便编译器可以做一些实实在在的工作。 他们决定包文件夹和类型映射到文件。 这工作得很好。 它特别设置的情感背景的新人:“我恨你不要惹我。” 但是,我离题。

默认的包是一个问题,不过,因为它没有明确定义的文件夹中。 如果你有包com ,你知道,有一个文件夹com的地方,但什么是默认包的文件夹的名字吗?

因此,设计师决定, import和缺省包不要混用。 事实上,当您尝试导入任何有没有包(即收到一个错误import TestStaticImport没有static*也将失败)。 请参阅如何从缺省包导入类

所以,问题不在于静态导入,但你尝试从默认的包导入。

像其他一些极端情况在Java中,有没有办法解决。

另见: 在Java的“默认包的静态成员不能被导入” -有些人能解释这种说法?



文章来源: import static without package name