【发布时间】:2015-04-19 09:52:42
【问题描述】:
import java.*;
为什么我不能做这个导入? 我没有导入包'java'的特定子包中的所有类,而是尝试导入'java'包下的所有子包。
如何导入所有的内置类
【问题讨论】:
-
Java没有办法递归导入所有子包。
标签: java
import java.*;
为什么我不能做这个导入? 我没有导入包'java'的特定子包中的所有类,而是尝试导入'java'包下的所有子包。
如何导入所有的内置类
【问题讨论】:
标签: java
java中没有子包这种东西。
java.util.stream 不是java.util 的子包。
因此import java.util.* 不会导入java.util.stream 的类。
要导入所有内置类,您必须一次导入一个包。不过,最好只导入您实际需要的类。
【讨论】:
正如您在 Oracle 文档上的 link 中所读到的,在 Apparent Hierarchies of Packages 标题下:
起初,包似乎是分层的,但实际上并非如此。为了 例如,Java API 包括一个
java.awt包,一个java.awt.color包,java.awt.font包,以及许多其他以java.awt。但是,java.awt.color包,java.awt.font包和其他java.awt.xxxx包不包含在java.awt包。前缀java.awt(Java 抽象窗口 Toolkit) 用于一些相关的包来制作 关系明显,但不显示包含。
【讨论】:
因为import some.example.Type; 只是导入类型而不是包。 import some.example.*; 表示您正在导入 some.example 包中包含的所有类型,而不是其中的其他包。
这是因为导入意味着该文件的代码将在运行时可供您的程序使用,并且包本身不包含任何代码。它包含具有代码的文件。
这就是为什么您不能在单个导入语句中导入所有内置代码的原因。最多可以在单个语句中导入包中不同文件中可用的所有代码,并且您知道import some.example.*;
【讨论】:
在导入类时使用通配符可能会使你的类命名空间变得混乱,所以如果你有一个名为 ClassA 的类在不止一次导入中(例如 import com.example1.* 和 import com.example2.* 其中ClassA 在两者中都定义并且你只需要在com.example1 中的实现)你会遇到冲突,所以只导入你真正需要使用的东西。
大多数 IDE 允许您轻松组织导入,因此只会导入您真正需要使用的类
【讨论】:
这和你想的不一样,考虑一下当你想使用ChannelHandler接口时,你可以使用import io.netty.channel.*;或import io.netty.channel.ChannelHandler;,但你不能使用import io.netty.*;,这就是为什么你不能使用import java.*;
【讨论】:
您可以导入 java.util.* 它工作正常,但是当您导入特定类而不是所有类时,导入时间会更短,但是如果您从同一个包中导入太多类,您可以使用 package.* 导入所有类而且jvm去fetch的时间更短,而不是一个一个地去。
按照惯例,您可以使用 import package.* 如果您使用来自同一个包的太多类。
【讨论】:
为什么?因为Java按设计分为不同的包。这样你就不能用所有存在的类来污染你的命名空间,你必须实际指定你打算在哪个命名空间中使用哪些类。
在 java 中,包不相互关联 - 没有层次结构(即使看起来很像),只是包的平面名称。
至于如何规避这一点,我认为唯一的方法是迭代所有包并基于该迭代生成您的 java 代码。没有直接的方法。
【讨论】: