Java从全部导入全部

Java从全部导入全部,java,import,packages,Java,Import,Packages,我有一个合乎逻辑的问题:为什么我不能从java中的所有包导入所有包? 例如,我可以从java.awt导入所有类: import java.awt.*; 但以下是不可能的: import java.awt.*.*; 我的目标是从awt.image和awt.event等导入所有内容。 还有别的办法吗 谢谢大家! 不,使用通配符导入通常是不好的风格,因为它会使代码更难阅读。没有办法实现导入a.package.*在Java中。指定了仅4种合法的导入类型: 单一类型导入声明(§7.5.1)导入单一命名

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

import java.awt.*;
但以下是不可能的:

import java.awt.*.*;
我的目标是从awt.image和awt.event等导入所有内容。 还有别的办法吗


谢谢大家!

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

没有办法实现导入a.package.*在Java中。指定了仅4种合法的导入类型:

单一类型导入声明(§7.5.1)导入单一命名类型, 通过提及其规范名称(§6.7)

e、 g.
import java.util.List

类型按需进口声明(§7.5.2)进口所有 根据需要,命名类型或命名包的可访问类型(§6.6) 提及类型或包的规范名称

e、 g.
import java.awt.*

单个静态导入声明(§7.5.3)导入所有可访问的 类型中具有给定名称的静态成员,方法是 名字

e、 g.
import static org.junit.Assert.assertEquals

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

e、 g.
import static org.junit.Assert.*


包允许单独引用同名的类。例如,有
java.awt.List
java.util.List
。什么可以阻止某人使用
java.*.*导入所有内容。那么
列表
将如何解决?会有太多的歧义。

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

  • 结果是包含了您可能根本不用的类。不清楚您正在使用什么
  • 范围更广,被认为是糟糕的编程实践
  • 最重要的是可能导致名称空间冲突。如果您明目张胆地从两个包中导入所有内容,可能会导致来自不同包的两个同名类之间发生冲突

  • 编辑:似乎导入的类比所需的多不会导致任何庞大的代码,但我还是更愿意显式导入这些类,以便清楚地了解我正在使用的是什么。

    可能是因为这通常是一件坏事?坦率地说,*运算符的存在是Java中的一个设计缺陷。您应该只导入实际使用的类。我们必须更改编译器才能使其正常工作。到目前为止,你还不能。我猜会有太多的冲突。如果导入所有内容,则肯定会有多个类被命名两次。这会导致模棱两可的局面。不过,我们可以说,詹姆斯·高斯林不喜欢。导入的java目的是只考虑C++中不需要的但不包括所有的内容。不一定。有时它实际上使它更可读,因为您有1个导入而不是50个导入。尽管大多数IDE都会把这个列表折叠起来,但我不得不同意AFS,而且随着像Eclipse这样的IDE的出现,无论如何它都会把它们折叠起来。如果你有那么多的导入,你很可能违反了内聚性原则,在你的课堂上做了很多事情。。。通配符不会降低代码的可读性,也不会降低代码的速度。唯一的问题可能是命名空间冲突-这可能会导致代码有点混乱,因为您必须使用完全限定的类名。但是,同样的情况是,你实际上必须使用两个同名的类…如果你真的想阅读代码,你从类开始,而不是从导入开始。你让它看起来像是前所未闻的,甚至是不允许的。这实际上相当普遍。我在同一个类中多次看到java.util.Date和java.sql.Date。用完整的包名解决了歧义。从理论上讲,如果Java允许这样的事情,在这里也同样适用。实际上,这种歧义是不允许的。尝试导入
    java.awt.List
    java.util.List
    ,您将得到一个编译器错误。在实际代码中使用完全限定的类名指定
    java.util.List
    可以消除歧义,这是正确的。但是这样做完全不需要导入。在import语句级别,是的。听起来好像你在说同名的类不能存在于同一个文件中。顺便问一下,您是如何在注释中获得代码格式的?还在这里学习。@Vidya这不是闻所未闻,但正如你所说的,你必须自己应付。如果允许您执行“importjava.*”,并且这将递归地导入所有内容,那么编译器将突发错误,因为它将尝试从不同的包导入2x列表。他们需要为此添加一个解析机制,或者在出现歧义时禁止此类导入(imho,这不是一个有用的功能)。@Vidya-around-code使用反引号格式化。例如,“test”产生
    test
    。。。您导入但未使用的类最终不会加载或包含。