Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse和javac之间奇怪的编译器差异_Java_Javac - Fatal编程技术网

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

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() {

下面的代码片段(从真实世界的代码中抽象)在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() {
            @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
    导入甚至是必要的,因为
    Inner
    接口嵌套在Outer.java中,但Eclipse和javac似乎都需要它
  • 我在尝试运行具有类似结构的生产代码的Ant构建时发现了这个问题。Eclipse中的一切都很好,但是Ant脚本拒绝通过

这看起来像是一个bug,正如Oracle的bug数据库所报告的那样


根据,import语句的顺序应该无关紧要。

我不确定,但很可能Eclipse给出的编译命令与手动命令不同。也许顺序颠倒了。唯一的另一种可能性是java编译器的不同版本。您是否有可能删除代码中多余的部分,留给我们仍然产生相同奇怪结果的最小部分?@Gene Eclipse有自己的编译器。@arshaji我去掉了大部分膨胀,这更好吗?@arshaji更新后的链接看起来确实符合我的情况,很好。对于JLS,我没有看到任何明确提到导入语句顺序不重要……这是一种隐含的理解还是我只是瞎了眼?@KevinK JLS没有明确说明顺序重要的事实意味着它不重要。