2013-07-12 5 views
8

Der folgende Ausschnitt (abstrahiert vom realen Code) kompiliert und läuft in Eclipse.Seltsamer Compiler-Unterschied zwischen Eclipse und Javac

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

schlägt jedoch fehl, es mit diesem Fehler, wenn Javac Kompilieren mit:

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 

Jetzt , wenn ich die Reihenfolge der Importanweisungen ändere, so:

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

... dann kompiliert es sowohl in Eclipse als auch in javac. Natürlich scheint die Reihenfolge der Importanweisungen eine Rolle zu spielen ... aber warum?

Hinweise:

  • Getestet habe ich dies mit Java JDK 1.6.0_30 und 1.7.0_21 auch Java JDK. Wenn dies ein Fehler ist, der seither behoben wurde, wäre das gut zu wissen.
  • Es mir fremd scheint, dass die package1.Outer.Mid.Inner Import sogar notwendig ist, angesichts der Inner Schnittstelle innerhalb Outer.java verschachtelt ist, aber beide Eclipse und javac scheint es
  • ich dieses Problem entdeckt zu verlangen, versuchen, eine Ant-Build von laufen Produktionscode, der eine ähnliche Struktur hatte. In Eclipse hat alles gut funktioniert, aber das Ant-Skript hat es einfach abgelehnt.
+0

Ich weiß nicht sicher, aber es ist wahrscheinlich Eclipse gibt einen anderen Kompilierbefehl als Sie von Hand sind. Vielleicht ist die Reihenfolge umgekehrt. Die einzige andere Möglichkeit sind verschiedene Versionen des Java-Compilers. – Gene

+3

Jede Chance, Sie könnten die überflüssigen Teile Ihres Codes löschen und uns mit dem Minimum verlassen, das immer noch die gleichen seltsamen Ergebnisse produziert? – arshajii

+0

@Gene Eclipse hat einen eigenen Compiler. – EJP

Antwort

4

Dies sieht wie ein Fehler aus, wie in der Oracle-Fehlerdatenbank here berichtet.

Nach der JLS §7.5, sollte die Reihenfolge der import-Anweisungen nicht wichtig sein.

+0

Der verknüpfte Fehler ist in Release 1.6u1 als behoben markiert. – EJP

+0

@EJP Sehen Sie das Update – arshajii

+0

@arshaji der aktualisierte Link sicherlich passt zu meinem Fall, gute finden. Für die JLS sehe ich keine explizite Erwähnung, dass die Reihenfolge der Importanweisungen egal ist ... ist das ein implizites Verständnis oder bin ich einfach blind? –