Java从全部导入全部
我有一个合乎逻辑的问题:为什么我不能从java中的所有包导入所有包? 例如,我可以从java.awt导入所有类: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)导入单一命名
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
。。。您导入但未使用的类最终不会加载或包含。