Pep*_* Lu 5 java enums 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);
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用maven构建时,它会给出一个编译错误:
mvn clean compile
Run Code Online (Sandbox Code Playgroud)
[ERROR] /Users/finup/Desktop/a/importtest/src/main/java/pepelu/ImportTest.java:[8,6]无法找到符号
将导入订单更改为:
import javax.annotation.Resource;
import pepelu.ImportTest.InnerClass.InnerEnum;
Run Code Online (Sandbox Code Playgroud)
我有一个成功的maven构建.
我搜索了文件,但无法找到解释.
有谁能解释一下导入在这种情况下是如何工作的?
我想原因是“通知”的依赖:你有一些元素X,你导入相同的文件/类,你要定义其内。
意义:
import pepelu.ImportTest.InnerClass.InnerEnum;
Run Code Online (Sandbox Code Playgroud)
实际上指的是同一个文件中的以下代码:
public static class InnerClass {
public enum InnerEnum {
Run Code Online (Sandbox Code Playgroud)
这意味着:对于编译器,为了处理该导入,它必须查看同一文件中类的主体。
似乎 javac 会“立即”做到这一点。意思是:它开始读取导入语句,从同一个类导入使它“暂停”查看导入,但检查以下类定义。
猜猜看:该类定义使用了另一个导入。为了“处理”该枚举的定义,编译器需要了解 @Resource 注释的位置/内容。但它还不知道注释(因为编译器还没有看到导入)。
当您更改顺序时,编译器会理解类定义中的@Resource 用法。
当然:真正的答案不是重新排序进口。真正的答案是不要从导入语句之后的类中导入某些内容。这样做绝对没有意义。
编辑,考虑到 OP 关于这如何在Redisson 中工作的评论:老实说,我不知道。这可能取决于究竟该类编译。也许这样的代码适用于较新(或较旧)版本的 javac,也许这适用于特定版本的 eclipse 或 intellij 或 xyz 编译器。
意思是:我给你解释了为什么你会遇到这个问题。这并不意味着任何编译器都一定会遇到同样的问题。