【问题标题】:import static without package name导入不带包名的静态
【发布时间】:2013-01-10 12:51:24
【问题描述】:

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

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)引用枚举字段?


附:请不要告诉我,空包是丑陋的风格等等。这个问题只是理论上的问题。

【问题讨论】:

  • 我在第一个问题上遇到了和你一样的问题......据我所知,这是一个限制。

标签: java importerror


【解决方案1】:

Java language specification 禁止从未命名的包中导入任何内容:

未命名包(第 7.4.2 节)中的类型没有规范名称,因此 在每种进口声明中都要求规范名称 意味着(a)无法导入未命名包中的类型,并且 (b) 无法导入未命名包中类型的静态成员。 因此,§7.5.1、§7.5.2、§7.5.3 和 §7.5.4 都需要编译时 任何尝试在 未命名的包。

【讨论】:

  • 而相关的是7.5.3/4。
  • 嗯,非常感谢您提供规范链接的确切答案!
【解决方案2】:

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

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

所以设计师决定import 和默认包不要混用。实际上,当您尝试导入没有包的任何内容时会出现错误(即没有 static*import TestStaticImport 也会失败)。见How to import a class from default package

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

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

另见:In Java- "Static Members of the default package cannot be imported"- Can some one explain this statement?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2013-01-02
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多