Eclipse和javac之间奇怪的编译器差异
下面的代码片段(从真实世界的代码中抽象)在Eclipse中编译和运行 package1/Outer.java:Eclipse和javac之间奇怪的编译器差异,java,javac,Java,Javac,下面的代码片段(从真实世界的代码中抽象)在Eclipse中编译和运行 package1/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() {
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();
}
}
}
package2/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中编译。显然,进口声明的顺序似乎很重要……但为什么
注:
- 我使用JavaJDK1.6.0_30和JavaJDK1.7.0_21对此进行了测试。如果这是一个已经修复的bug,那么最好知道
- 我觉得奇怪的是,
导入甚至是必要的,因为package1.Outer.Mid.Inner
接口嵌套在Outer.java中,但Eclipse和javac似乎都需要它Inner
- 我在尝试运行具有类似结构的生产代码的Ant构建时发现了这个问题。Eclipse中的一切都很好,但是Ant脚本拒绝通过
根据,import语句的顺序应该无关紧要。我不确定,但很可能Eclipse给出的编译命令与手动命令不同。也许顺序颠倒了。唯一的另一种可能性是java编译器的不同版本。您是否有可能删除代码中多余的部分,留给我们仍然产生相同奇怪结果的最小部分?@Gene Eclipse有自己的编译器。@arshaji我去掉了大部分膨胀,这更好吗?@arshaji更新后的链接看起来确实符合我的情况,很好。对于JLS,我没有看到任何明确提到导入语句顺序不重要……这是一种隐含的理解还是我只是瞎了眼?@KevinK JLS没有明确说明顺序重要的事实意味着它不重要。