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 derInner
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.
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
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
@Gene Eclipse hat einen eigenen Compiler. – EJP