Java import class/enum inner an inner class 时的导入顺序有何影响

Java how import order matters when import class/enum inner an inner class

这是我的 class:

package pepelu;

import pepelu.ImportTest.InnerClass.InnerEnum;
import javax.annotation.Resource;

public class ImportTest {
    @Resource
    public static class InnerClass {
        public enum InnerEnum {
            A
        }
    }

    public static void main(String[] args) {
        System.out.println(InnerEnum.A);
    }
}

我用maven构建时会报编译错误:

mvn clean compile

[ERROR] /Users/finup/Desktop/a/importtest/src/main/java/pepelu/ImportTest.java:[8,6] cannot find symbol

将导入顺序更改为:

import javax.annotation.Resource;
import pepelu.ImportTest.InnerClass.InnerEnum;

我成功构建了 Maven。

我搜索了文档,但找不到对此的解释。

谁能解释一下导入在这种情况下是如何工作的?

我想原因是 "circular" 依赖:你有一些元素 Ximport 在同一个 file/class 中正在定义它。

含义:

import pepelu.ImportTest.InnerClass.InnerEnum;

实际上指的是同一文件中的以下代码:

public static class InnerClass {
    public enum InnerEnum {

这意味着:对于编译器来说,为了处理导入,它必须查看同一文件中 class 的主体。

javac 似乎做到了 "immediately"。含义:它开始读取导入语句,并且从相同的 class 导入使其 "suspend" 查看导入,但检查以下 class 定义。

猜猜看:class 定义使得 use 另一个导入。为了 "process" 该枚举的定义,编译器需要理解 where/what @Resource 注释的含义。但它还不知道注释(因为编译器还没有看到导入)。

当您更改顺序时,编译器会理解 class 定义中的 @Resource 用法。

当然:真正的答案是不是重新订购进口商品。真正的答案是 而不是 从 import 语句之后的 class 导入一些东西。这样做完全没有意义。

编辑,考虑到 OP 关于如何在 Redisson 中工作的评论:老实说,我不知道。这可能取决于 class 的编译方式。也许这样的代码适用于较新(或较旧)版本的 javac,也许适用于特定版本的 eclipse 或 intellij 或 xyz 编译器。

意思是:我已经向你解释了为什么你 运行 会陷入这个问题。这并不意味着 任何 编译器都必须 运行 进入相同的问题。