2013-07-12 9 views
8

Aşağıdaki parçacık (gerçek dünya kodundan soyutlanmış) derler ve Eclipse'de çalışır. ŞimdiEclipse ve javac arasındaki garip derleyici farkı

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 

:

Paket1/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: javac kullanarak derleme yaparken

package package2; 

public interface Bar { 
    void bar(); 
} 

Ancak, bu hata ile başarısız , İçe aktarma ifadelerinin sırasını değiştirirsem, şöyle olur:

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

... Daha sonra hem Eclipse hem de javac'ta derler. Açıkçası, ithalat ifadelerinin sırası önemli gibi görünüyor ... ama neden?

Notlar:

  • Ben de bu kullanarak Java JDK 1.6.0_30 ve Java JDK 1.7.0_21 test etti. Bu, düzeltilen bir hata ise, bu bilmek güzel olurdu.
  • O package1.Outer.Mid.Inner ithalat Inner arayüzü Outer.java içinde yuvalanmış verilen, hatta gerekli olduğunu bana garip görünüyor ama Eclipse ve Javac hem ben bir Ant yapı çalıştırın çalışırken bu sorunu keşfettim o
  • gerektirecek gibi görünüyor Benzer bir yapıya sahip üretim kodu. Her şey Eclipse'de güzeldi, ama Karınca yazısı sadece geçmeyi reddetti.
+0

Elbette emin değilim ama muhtemelen Eclipse elinizdekinden farklı bir derleme komutu veriyor. Belki de sipariş tersine çevrilir. Diğer tek olasılık, java derleyicinin farklı versiyonlarıdır. – Gene

+3

Kodunuzun gereksiz bölümlerini silip, aynı garip sonuçları üreten minimum değeri bize bırakma şansınız var mı? – arshajii

+0

@Gene Eclipse kendi derleyicisine sahiptir. – EJP

cevap

4

Bu, Oracle'ın here hata veritabanında bildirildiği gibi bir hataya benziyor.

JLS §7.5'a göre, import -siparişlerinin sırası önemli değildir.

+0

Bağlı hata, 1.6u1 sürümünde sabit olarak işaretlendi. – EJP

+0

@EJP Güncelleme – arshajii

+0

@arshaji güncellenen güncellemeyi görmek benim durumum, iyi bulmak için kesinlikle görünüyor. JLS için, içe aktarma bildirimi siparişinin önemli olmadığı konusunda açık bir söz görmüyorum ... örtülü bir anlayış mı yoksa sadece kör mü? –