Java 进口的实施

Java 进口的实施,java,import,implementation,Java,Import,Implementation,首先,我不是一个Java爱好者,但我发现表面上看起来与导入工作方式不一致 假设您有一个文件,在这个文件中有您的主函数,并且您还定义了一个类Foo,现在包中还存在一个不同的Foo实现。假设您希望在功能中同时使用这两个版本 不能从其包中显式导入Foo,即导入mypackage.Foo 由于这将导致与文件中本地定义的类发生冲突,因此在编译时会生成错误 您可以导入整个软件包,即导入我的软件包。* 这将起作用,您可以使用完全限定名称访问Foo,使用简单名称将导致使用本地Foo。 我看到的不一致之处是,虽然

首先,我不是一个Java爱好者,但我发现表面上看起来与导入工作方式不一致

假设您有一个文件,在这个文件中有您的主函数,并且您还定义了一个类Foo,现在包中还存在一个不同的Foo实现。假设您希望在功能中同时使用这两个版本

不能从其包中显式导入Foo,即导入mypackage.Foo

由于这将导致与文件中本地定义的类发生冲突,因此在编译时会生成错误

可以导入整个软件包,即导入我的软件包。*

这将起作用,您可以使用完全限定名称访问Foo,使用简单名称将导致使用本地Foo。 我看到的不一致之处是,虽然前者会生成错误(您已经导入了一个类,导入的唯一目的是能够使用简单名称而不是完全限定名称),但后者甚至不会导致警告

我认为这两种情况都会产生警告,即您可能使用了错误的类,因为它在两个位置定义,或者import语句是多余的,因为使用简单名称将解析为本地定义的类,而不是导入的类

所以我的问题是:有没有一个潜在的原因,它是以这种方式实现的


是的,这是一个异常情况,我理解。

即使不导入mypackage,也可以使用完全限定名访问Foo。*


关于警告:我想没有什么危险的事情发生。您没有使用任何模棱两可的内容。

即使不导入mypackage,您也可以使用完全限定名访问Foo。*


关于警告:我想没有什么危险的事情发生。您没有使用任何模棱两可的内容。

导入mypackage.*可能是mypackage中所有其他内容所必需的。如果有一个警告,这将是很难避免它在所有,即你将不得不完全合格的所有其他类等,你从mypackage使用。 更糟糕的是,考虑MyPoSE版本1没有包含FO的情况,因此没有冲突,因此根本没有理由发出警告。版本2包含Foo,但它当然不是您希望在程序中访问的Foo。
因此,如果编译器警告“import package.*”冲突,则可能会降低“import package.*”的向上兼容性。

import mypackage.*可能是mypackage中所有其他内容所必需的。如果有一个警告,这将是很难避免它在所有,即你将不得不完全合格的所有其他类等,你从mypackage使用。 更糟糕的是,考虑MyPoSE版本1没有包含FO的情况,因此没有冲突,因此根本没有理由发出警告。版本2包含Foo,但它当然不是您希望在程序中访问的Foo。
因此,如果编译器警告“import package.*”冲突,它会使“import package.*”的向上兼容性降低。

如上所述,导入实际上不会对另一个包中的
Foo
执行任何操作;无论您是否导入,您都不能通过短类名引用另一个Foo,您可以通过完全限定的类名引用它

从概念上讲,您可以将
import mypackage.*
不一定是“从
mypackage
导入所有类”,而是“从
mypackage
导入所有不冲突的类”。我不知道Sun的编译器实现是如何做到这一点的,但它肯定会决定不将mypackage.Foo作为通配符的一部分进行匹配(因此根本不会导入它),并且代码的工作方式也是一样的

导入实际上只是将别名从短类名设置为完全限定类名(例如,当我说
Date
时,将其解释为
java.util.Date
)。如果你做了一些完全冗余的事情,比如只导入冲突类,你会得到一个警告。但是,如果您使用
*
来拉入一个完整的包,编译器抱怨其中一个类名冲突似乎是错误的;这种情况在实践中经常发生,而且99%以上的时候是无害的,这会导致“狼来了”综合症,以至于你不太可能注意这些警告和其他警告,因为你已经习惯了被它们轰炸


顺便说一下,如果您同时导入
java.util.*
java.sql.*
,这是允许的,并且本身不会导致任何警告;但是,如果您随后尝试仅引用
Date
(本地包中没有此类类),则会出现编译错误,因为名称不明确

如上所述,进口实际上对另一个包中的
Foo
没有任何影响;无论您是否导入,您都不能通过短类名引用另一个Foo,您可以通过完全限定的类名引用它

从概念上讲,您可以将
import mypackage.*
不一定是“从
mypackage
导入所有类”,而是“从
mypackage
导入所有不冲突的类”。我不知道Sun的编译器实现是如何做到这一点的,但它肯定会决定不将mypackage.Foo作为通配符的一部分进行匹配(因此根本不会导入它),并且代码的工作方式也是一样的

导入实际上只是将别名从短类名设置为完全限定类名(例如,当我说
Date
时,将其解释为
java.util.Date
)。如果你做了一些完全多余的事情,比如