首页 > 解决方案 > 为什么重新排列导入会导致编译失败?

问题描述

为什么重新安排 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。

标签: javaimport

解决方案


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

所以这是一个错误,请寻求解决方法。


推荐阅读