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

时间:2013-07-12 00:08:40

标签: 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();
        }
    }

}

包2 / Bar.java:

package package2;

public interface Bar {
    void bar();
}

但是,使用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

现在,如果我切换import语句的顺序,就像这样:

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

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

注意:

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

1 个答案:

答案 0 :(得分:4)

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

根据JLS §7.5import语句的顺序无关紧要。