【问题标题】:Java Package Hierarchy: Middle Level Cannot Find Lower Level Despite Import StatementJava 包层次结构:尽管有 Import 语句,但中层无法找到下层
【发布时间】:2021-03-03 04:41:42
【问题描述】:

我已经定义了一个数据结构,它使用了我也定义的另一个较低级别的数据结构。为了整洁,我希望每个数据结构都有自己的目录和包名。假设上层数据结构的包名为packageA,下层数据结构为packageB。然后,我想在程序中使用 packageA 中定义的数据结构,例如 Program。所以我有一个这样的目录结构:

Program
 |- Program.java
 |- packageA
     |- ClassA.java
     |- packageB
         |- ClassB.java

ClassB.java 位于顶部

package packageB;

ClassA.java 位于顶部

package packageA;
import packageB.ClassB;

然后Program.java有了 import packageA; 并在其代码中引用 ClassA。

当我尝试使用 javac *.java 在顶层编译时,我收到包 packageB 不存在的错误。

我做错了什么,我该如何实现这个简单的目标?谢谢。

【问题讨论】:

  • 进口不是相对的。无论您在同一个包层次结构中的哪个位置,都需要进行绝对导入。

标签: java package hierarchy


【解决方案1】:

您在ClassA.java 中的导入语句是错误的。类型的导入语句必须是其规范名称。 JLS 7.5.1 是这样说的:

7.5.1。单一类型导入声明
单一类型导入声明通过给出其规范名称来导入单一类型,使其在出现单一类型导入声明的编译单元的模块、类和接口声明中以简单名称可用.
TypeName 必须是类类型、接口类型、枚举类型或注释类型的规范名称 (§6.7)。

而 6.7 节中规范名称的相关定义是

作为另一个命名包的子包的命名包的完全限定名称由包含包的完全限定名称,后跟“.”,后跟子包的简单(成员)名称组成。

这使得使用相对包名导入成为可能。您的导入声明必须是

import packageA.packageB.ClassB;

并且ClassB.java本身的包声明必须是

package packageA.packageB;

我假设Program 不是一个包;

【讨论】:

  • 非常感谢!你的假设是正确的。我误解了软件包比它们具有更大的独立性和可移植性。我曾期望我可以在某个地方单独开发 packageB,然后简单地将其目录复制为某个将使用它的项目中的子目录——但如果不通过并更改包名称以匹配新目录设置,则无法执行此操作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多