簡體   English   中英

Eclipse和Javac之間奇怪的編譯器區別

[英]Strange compiler difference between Eclipse and 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() {
            @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 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腳本只是拒絕執行。

這看起來像是一個錯誤,如Oracle的錯誤數據庫此處所報道。

根據JLS§7.5import語句的順序應該無關緊要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM