Eclipse和javac之间奇怪的编译器差异

Kev*_*n K 8 java javac

以下代码段(从实际代码中抽象出来)在Eclipse中编译和运行.

包1/Outer.java:

package package1;

import package1.Outer.Mid.Inner;
import package2.Bar;

public class Outer {
    final Mid mid = new Mid();

    public Outer() {
        mid.setInner(new Inner() {
            @Override public void foo() {
                System.out.println("In Outer.foo()");
            }
        });
    }

    public static class Mid implements Bar {
        private Inner inner;

        public void setInner(Inner inner) {
            this.inner = inner;
        }

        public Inner getInner() {
            return this.inner;
        }

        @Override
        public void bar() {}

        interface Inner {
            void foo();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

包2/Bar.java:

package package2;

public interface Bar {
    void bar();
}
Run Code Online (Sandbox Code Playgroud)

但是,在使用javac进行编译时,它会因此错误而失败:

package1\Outer.java:31: cannot find symbol
symbol  : class Bar
location: class package1.Outer
        public static class Mid implements Bar {
                                           ^
package1\Outer.java:42: method does not override or implement a method from a supertype
                @Override
                ^
2 errors
Run Code Online (Sandbox Code Playgroud)

现在,如果我切换import语句的顺序,如下:

import package2.Bar;
import package1.Outer.Mid.Inner;
Run Code Online (Sandbox Code Playgroud)

...然后它在Eclipse和javac中编译.很明显,导入语句的顺序似乎很重要......但为什么呢?

笔记:

  • 我使用Java JDK 1.6.0_30以及Java JDK 1.7.0_21对此进行了测试.如果这是一个已经修复过的bug,那就太好了.
  • package1.Outer.Mid.Inner鉴于Inner接口嵌套在Outer.java中,导入甚至是必要的,这似乎很奇怪,但Eclipse和javac似乎都需要它
  • 我发现这个问题试图运行具有类似结构的生产代码的Ant构建.在Eclipse中,一切都很好,但Ant脚本却拒绝通过.

ars*_*jii 4

这看起来像是一个错误,正如 Oracle 错误数据库中报告的那样。

\n

根据JLS \xc2\xa77.5, - 语句的顺序import应该不重要。

\n