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" 依赖:你有一些元素 X
你 import 在同一个 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 编译器。
意思是:我已经向你解释了为什么你 运行 会陷入这个问题。这并不意味着 任何 编译器都必须 运行 进入相同的问题。
这是我的 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" 依赖:你有一些元素 X
你 import 在同一个 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 编译器。
意思是:我已经向你解释了为什么你 运行 会陷入这个问题。这并不意味着 任何 编译器都必须 运行 进入相同的问题。