gpt4 book ai didi

Java 类名与嵌套包名相同

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:54:18 25 4
gpt4 key购买 nike

在我的 Java 应用程序中,我使用第三方库。

但是,我发现了一些奇怪的地方,有一些嵌套的包,还有一些类的名字可能和包的名字一样。

恐怕我说不清楚。这是一个例子:

  com.xx.a
com.xx.a.a

并且在“com.xx.a”中有一个名为“a”的类。

所以如果我想称这个类为“a”...

我写:

a ma = new com.xx.a.a();

然后 IDE 会认为我指的是包“com.xx.a.a”。

那我就不能调用了。

我想知道为什么?

顺便说一下,库提供者似乎不希望我们使用这些类。

他们是怎么做到的?

最佳答案

Java 语言允许类标识符被包标识符隐藏。在您的情况下, com.xx.a com.xx.a 遮盖了。

来自Java Language Specification :

6.3.2 Obscured Declarations

A simple name may occur in contexts where it may potentially be interpreted as the name of a variable, a type or a package. In these situations, the rules of §6.5 specify that a variable will be chosen in preference to a type, and that a type will be chosen in preference to a package. Thus, it may sometimes be impossible to refer to a visible type or package declaration via its simple name. We say that such a declaration is obscured.

我必须说,§6.5 中对标识符的含义进行分类的规则还远未明确。

您仍然碰巧拥有违反此规则的库副本的原因是因为该规则不适用于类文件/JAR 文件和 JVM。

这意味着您可以在 JAR 文件中有这样的命名冲突,但您永远不会将其视为 javac 的输出。产生这些类/包名称的工具很可能是一个代码混淆器,它产生这种困惑的代码来压缩文件的大小并混淆代码以防止逆向工程。


附言。仔细一看,它实际上可能是 Eclipse 端的错误(假设这是您正在谈论的 IDE)。通过让空包名称与类名称发生冲突,Eclipse 会阻塞 javac 接受的内容。规范很难遵循,但据我所知,javac 在这种情况下遵循规范。

关于Java 类名与嵌套包名相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9584086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com