java - 为什么重新排列导入会导致编译失败?
问题描述
为什么重新安排 Java 导入会导致代码不再编译?
我认为 Java 导入的顺序对于代码的语义并不重要,使其成为安全操作。编辑器使组织/优化/重新排列 Java 导入语句变得非常容易,并且一些样式检查/分析工具将强制执行命令。我没有成功地在网上找到提到重新安排进口的危险的帖子。但是,我现在遇到了重新排列导入导致代码中断的情况。
以下代码将无法编译,说它找不到符号Retention
:
package foo;
import foo.BadImportsTest.TestOptions.Option;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.junit.Assert;
import org.junit.Test;
public final class BadImportsTest {
@Retention(RetentionPolicy.RUNTIME)
public @interface TestOptions {
enum Option {
BAR,
BAZ,
}
}
@Test
public void DoTest() {
Assert.assertNotEquals(Option.BAR, Option.BAZ);
}
}
但是,按照最初的顺序,第一个 import ( foo.BadImportsTest.TestOptions.Option
) 最后,它会编译。
我试着检查规格。看起来这是一个单一类型导入声明,但我对第 7.5.1 节的阅读并没有解释上述行为。我在当前文件中导入了一个嵌套类型,但是,它会导致任何看起来应该在查找时出错的问题,Option
因为:
import
如果在包含该声明的编译单元中声明了由单一类型导入声明导入的类型,import
则忽略该声明。
我通过 Maven 和 IntelliJ IDEA 测试了编译,在所有情况下都针对 Java 8。
我确实发现导入顺序似乎对编译成功很重要?但这指向了一个似乎不适用的编译器错误,因为它涉及static
导入并且我没有使用静态导入。此外,它在 Java 8 中被标记为已修复,我正在使用 Java 8。
解决方案
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6391197
下面的代码仍然给我一个错误。
package test;
import static test.Outer.Inner.CONST;
import java.util.Iterator;
class Outer {
interface Inner extends Iterator {
static String CONST = "CONST";
}
}
该错误仍然存在于 java 8 中,至少在我的编译器版本中:javac 1.8.0_121。
Java 8 相关错误:https ://bugs.java.com/bugdatabase/view_bug.do?bug_id=8148472
所以这是一个错误,请寻求解决方法。
推荐阅读
- java - 合并排序的 Java 实现;找不到错误
- c++ - 使用 TRESTClient 关闭时程序异常终止
- hibernate - 保存 JPA 实体错误 - TransientObjectException:对象引用未保存的瞬态实例 - 保存瞬态实例
- python - 如何根据单元格中存在的单词使用 pandas 替换列值
- java - 使用 Jetty 阻止响应
- react-native - 无法播放视频。如何访问 Android 模拟器中文件下载中的视频路径
- javascript - 如何从已编译的 Electron 应用程序中获取源文件?
- model-view-controller - 向剑道网格编辑器弹出窗口添加 id
- wso2 - 有没有办法更新正在运行的 Siddhi 应用程序
- python - Asyncio:当我们需要使用异步方法时,如何在 __del__ 方法中清理类的实例