java – 仅包含子包的按需导入声明

相关:
How can I compile “import pack.*” with ant/javac, when there are no such classes?

假设我们有给定的包结构

parent
|
---a
---b

包父类只包含两个子包a和b(没有类在包父项下).

代码导入父.*,位于除父级之外的包中,使用Maven编译(即javac)会引发编译时错误.错误是:

package parent does not exist

我查看了关于这种情况的Java语言规范(按需导入的声明,其中没有实际导入任何类型). Paragraph 7.5.2 of the JLS关于按需导入声明似乎没有指定此行为.

这是javac的错误吗?我不是在问如何规避编译错误.我想知道为什么javac会抛出错误,因为我在JLS中找不到它应该引用的任何引用;让我相信这可能是一个错误.

我测试了JDK 1.4,1.6,1.7和1.8,错误是一样的.

作为旁注,Eclipse中使用相同的代码没有编译错误(使用Eclipse Indigo,Juno,Luna和Mars进行测试).

注意:当“纯化”仅依赖于Eclipse编译器的(旧)现有项目时,我遇到了这种行为.我花了一段时间才发现这是我得到的编译错误的根本原因.

最佳答案 我想你要找的是
section7.4.3

A package is observable if and only if either:

  • A compilation unit containing a declaration of the package is
    observable (§7.3).

  • A subpackage of the package is observable.

The packages java, java.lang, and java.io are always observable.

并在7.5.2

It is a compile-time error if the named package or type is not accessible (§6.6).

因此,如果包中没有任何内容,则它不存在,并且该错误实际上位于Eclipse编译器的一侧;它在very old bug report中被描述为处于“LATER”状态,直到最终该状态被弃用并且它被移动到WONT_FIX.如果您认为值得修复,请随意重新打开它(现在JLS已在该领域得到澄清)

点赞