13

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

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

这可以通过引入 this 的静态导入来解决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拜托,不要告诉我,空包是丑陋的风格等等。这个问题只是理论上的问题。

4

2 回答 2

17

Java 语言规范禁止来自未命名包的任何导入:

未命名包中的类型(第 7.4.2 节)没有规范名称,因此每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型,以及(b)静态成员无法导入未命名包中的类型。因此,第 7.5.1 节、第 7.5.2 节、第 7.5.3 节和第 7.5.4 节都要求在尝试将类型(或其静态成员)导入未命名包中时出现编译时错误。

于 2013-01-10T12:55:35.743 回答
5

在古代,Java 的发明者必须将 Java 类型映射到文件,这样编译器才能做一些真正的工作。他们决定将包映射到文件夹,将类型映射到文件。那工作得很好。尤其是给新人定下了情感背景:“我恨你,别惹我。” 但我离题了。

但是,默认包是个问题,因为它没有明确定义的文件夹。如果您有 package com,您知道com某处有一个文件夹,但默认包的文件夹名称是什么?

所以设计师决定不要import和默认包混合。事实上,当您尝试导入任何没有包的东西时会出现错误(即import TestStaticImport没有staticand*也会失败)。请参阅如何从默认包中导入类

所以问题不在于静态导入,而是您尝试从默认包导入。

像 Java 中的其他一些极端情况一样,没有解决方案。

另请参阅:在 Java 中-“无法导入默认包的静态成员”-有人可以解释此语句吗?

于 2013-01-10T13:00:51.870 回答