这是我的课程:
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构建成功。
我搜索了文档,但是找不到解释。
有人可以解释在这种情况下导入的工作原理吗?
答案 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编译器。
意思:我给你一个解释,为什么你遇到这个问题。这并不意味着任何编译器都必须遇到相同的问题。