【问题标题】:Java "static import" vs. "import static" in Java 8Java 8 中的“静态导入”与“静态导入”
【发布时间】:2013-01-02 20:34:41
【问题描述】:

我试图在 Java 上使用静态导入,但我写错了

static import java.lang.System.out;

并且编译的代码(虽然找不到“out”符号),没有语法错误。

那么,“静态导入”究竟是什么意思?

【问题讨论】:

  • 真的吗?根据docs.oracle.com/javase/specs/jls/se5.0/html/syntax.html,这应该是一个语法错误——关键字 import 只能开始一个导入声明。
  • 它无法为我编译...您使用的是什么 IDE?
  • 另外,你把那行代码放在哪里了?无论我将它放在类声明之上还是类内部,Eclipse 都会给我一个错误。
  • 所以这是一个错误,我正在为 Mac OS X 使用 Sun 的 Java 8 (SDK 1.8) 预览版。它应该是那里的语法错误(即使没有找到“out”符号,因为如果我使用 System.out.println,通过“静态导入”,程序编译时不会出现错误或警告)。
  • @PauloTorrens - 啊!这可能是编译器错误,也可能是我不知道的 Java 8 语言的更改。 JLS 8 尚未发布/最终确定。

标签: java static import java-8


【解决方案1】:

这不应该编译。

static import java.lang.System.out;

根据JLS,单个静态导入应如下所示:

import static java.lang.System.out;

Java import 语句的所有形式 import 关键字开头,我认为没有任何其他上下文(即除了 import 语句)其中 import可以使用关键字。

注意:importstatic 关键字在此上下文中不是修饰符,因此“修饰符可以按任何顺序提供”元规则在这里不适用。


简而言之,您的编译器/IDE 损坏或混乱......或者您正在查看的不是真正的 Java 源代码。

【讨论】:

    【解决方案2】:

    显然,这是一个错误。

    我正在使用 Sun 的 Java 8 (JDK 1.8) 来测试 lambdas...但我认为接受“静态导入”很奇怪。

    感谢您的所有回答。我要把这个报告给孙。 :)

    【讨论】:

      【解决方案3】:

      为了访问类的静态成员,您必须使用包含它的完整类名。例如,要访问Math 类中的pi 值,您必须使用java.lang.Math.PI。但是,如果你导入它 (import static java.lang.Math.PI),你可以在你的代码中使用 PI 来访问它。

      【讨论】: