2

我有一个合乎逻辑的问题:为什么我不能从 java 中的所有包中导入所有包?例如,我可以从 java.awt 导入所有类:

import java.awt.*;

但以下是不可能的:

import java.awt.*.*;

我的目标是从 awt.image 和 awt.event 等导入所有东西。还有另一种方法可以做到这一点吗?

谢谢!

4

3 回答 3

3

没有办法import a.package.*.*;在 Java 中实现。JLS 第 7.5 节指定了仅有的 4 种合法进口类型:

单一类型导入声明(第 7.5.1 节)通过提及其规范名称(第 6.7 节)来导入单个命名类型。

例如import java.util.List;

按需类型导入声明(第 7.5.2 节)通过提及类型或包的规范名称,根据需要导入命名类型或命名包的所有可访问类型(第 6.6 节)。

例如import java.awt.*;

单静态导入声明(第 7.5.3 节)通过给出其规范名称,从一个类型中导入所有具有给定名称的可访问静态成员。

例如import static org.junit.Assert.assertEquals;

按需静态导入声明(第 7.5.4 节)通过提及类型的规范名称,根据需要导入命名类型的所有可访问静态成员。

例如import static org.junit.Assert.*;

包允许单独引用同名的类。例如有java.awt.Listjava.util.List。什么会阻止某人使用java.*.*;. 那怎么List解决呢?会有太多的歧义。

于 2013-10-18T19:31:26.740 回答
2

不,使用通配符导入通常是不好的风格,因为它会使您的代码更难阅读。

于 2013-10-18T19:25:54.017 回答
0

使用通配符导入的一些缺点:

  1. 结果包括您可能根本不使用的类。不清楚您正在使用什么。
  2. 更广泛的范围被认为是不好的编程习惯。
  3. 最重要的可能会导致命名空间冲突。如果您公然从两个包中导入所有内容,则可能会导致来自不同包的两个具有相同名称的类之间发生冲突。

编辑:似乎导入比需要更多的类不会导致任何庞大的代码,但我仍然希望明确导入类以清楚地了解我正在使用的内容。

于 2013-10-18T19:31:59.247 回答