Java在导入类/枚举内部类时导入顺序的重要性

时间:2018-08-16 09:11:37

标签: java maven redisson

这是我的课程:

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
  

[错误] /Users/finup/Desktop/a/importtest/src/main/java/pepelu/ImportTest.java:[8,6]找不到符号

将导入顺序更改为:

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

我的Maven构建成功。

我搜索了文档,但是找不到解释。

有人可以解释在这种情况下导入的工作原理吗?

1 个答案:

答案 0 :(得分:4)

我想原因是“循环”依赖性:您在定义文件的同一文件/类中有一个元素X,您导入

含义:

import pepelu.ImportTest.InnerClass.InnerEnum;

实际上是在同一文件中引用以下代码:

public static class InnerClass {
    public enum InnerEnum {

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

似乎javac可以“立即”执行该操作。含义:它开始读取import语句,并且从同一类的导入使它“挂起”查看导入,但检查以下类的定义。

猜猜是什么:该类定义使使用成为另一个导入。为了“处理”该枚举的定义,编译器需要了解@Resource注释的位置/含义。但它尚不知道注释(因为编译器尚未看到导入)。

更改顺序时,编译器将在类定义中理解@Resource的用法。

当然:真正的答案是重新订购进口商品。真正的答案是从导入语句之后的类中导入某些内容。这样做绝对没有意义。

编辑,根据OP的评论,该评论如何在Redisson中起作用:说实话,我不知道。它可能取决于该类的精确度。也许这样的代码适用于更新(或更旧)的javac版本,也许适用于特定版本的eclipse或intellij或xyz编译器。

意思:我给你一个解释,为什么你遇到这个问题。这并不意味着任何编译器都必须遇到相同的问题。