6

在查看Sun 的 JVM 实现的一些源代码时,我遇到了晦涩难懂的import语法。

import java.awt;

从源代码看,这个import语句似乎是在导入整个java.awt包,但标准是使用包通配符:import java.awt.*;. 但是,importin 语句的语法ComponentFactory无效,不能用 JDK 或 Eclipse 编译。

为什么 Java 开发人员会使用这种不可编译的语法,而不是正确的.*语法?(也许开发人员使用支持这种语法的不同编译器?)

4

2 回答 2

4

查看了最新的JLS (http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.5.1),它说:

示例 7.5.1-3。不导入子包

请注意,导入语句不能导入子包,只能导入类型。

例如,尝试导入 java.util 然后使用名称 util.Random 来引用类型 java.util.Random 是行不通的:

import java.util;   // incorrect: compile-time error
class Test { util.Random generator; }

语言设计者没有理由使用不同版本的 Java。他们可能有一些用于编码和测试的秘密工具,他们可能还会测试一些新功能(但我不认为这是一个新功能,因为新功能不应该在没有任何描述的情况下像这样发布)

我相信是 HTML 格式自动消除了.*导入声明的所有部分。

于 2013-01-31T04:15:29.743 回答
1

根据Oracle 发布的一些文档:

注意:另一种不太常见的导入形式允许您导入封闭类的公共嵌套类。例如,如果 graphics.Rectangle 类包含有用的嵌套类,例如 Rectangle.DoubleWide 和 Rectangle.Square,则可以使用以下两个语句导入 Rectangle 及其嵌套类。

import graphics.Rectangle;
import graphics.Rectangle.*;

请注意,第二个 import 语句不会导入 Rectangle。

但是,在尝试 import 之后java.awt,我意识到这不是有效的语法,因为它只是一个包而不是一个类。这让我相信他们发布的代码只是省略了.*大部分导入后的代码,以使代码看起来更干净。无论如何,您不能像这样编写导入。

于 2013-01-31T04:06:08.443 回答