2013-06-11 14 views
7

Dies kompiliert mit Eclipse finden:Wie kommt Eclipse kompiliert diesen Java-Code, aber nicht Ant?

abstract class CollectionView implements Collection<Object> { 

... 
     public Object[] toArray(Object[] o) { 
      if (fast) { 
       return get(map).toArray(o); 
      } else { 
       synchronized (map) { 
        return get(map).toArray(o); 
       } 
      } 
     } 
... 
} 

    class KeySet extends CollectionView implements Set<Object> { 

     protected Collection<Object> get(Map<Object, Object> map) { 
      return map.keySet(); 
     } 

     protected Object iteratorNext(Map.Entry entry) { 
      return entry.getKey(); 
     } 
    } 

aber es funktioniert nicht kompilieren, wenn Ant mit:

error: KeySet is not abstract and does not override abstract method toArray(T[]) in Set

ich sehen kann, warum sollte der Code mit Eclipse kompilieren: KeySet bereits die Umsetzung des toArray erbt (T []) Methode aus CollectionView.

Aber warum schlägt es fehl, wenn ich mit Ant kompiliere?

<javac srcdir="src" destdir="bin" debug="on"> 
     <compilerarg value="-Xlint:unchecked"/> 
     <compilerarg value="-Xlint:deprecation"/> 
    </javac> 
+0

Das ist ein schwieriger. Es muss Unterschiede in den Abhängigkeiten oder der Reihenfolge der Abhängigkeiten geben? – djangofan

+0

nicht sicher. aber beide Klassen sind innere Klassen derselben Klasse. –

+0

Implementiert die einschließende Klasse 'toArray()'? –

Antwort

1

Es gibt mehrere Fälle, in denen Eclipse kompiliert fein und javac nicht. Wenn es Ihnen nichts ausmacht, gibt es drei Möglichkeiten, die ich mit dem Eclipse-Compiler erstellen kann.

  1. Paket vorkompilierte Klassen (Hacky, nicht empfohlen) eclipse

  2. den Eclipse-Compiler-Adapter mit Ant verwenden. Wenn Sie die Eigenschaft build.compiler angeben, sind alle Java-Aufgaben von nun an in Ihrem Ant-Build betroffen. Sie können es auf "org.eclipse.jdt.core.JDTCompilerAdapter" setzen. Beachten Sie, dass Sie diese Klasse (und Klassen, von denen sie abhängt) in Ihren Klassenpfad zum Erstellen von Ameisen aufnehmen müssen. Der einfachste Weg ist es, die notwendigen Gläser auf den Ordner lib Ihrer Ant Installation

  3. Beim Bau mit Maven configure hinzufügen, um dieses

     <plugin> 
          <groupId>org.apache.maven.plugins</groupId> 
          <artifactId>maven-compiler-plugin</artifactId> 
          <version>3.1</version> 
          <configuration> 
           <compilerId>eclipse</compilerId> 
           <compilerVersion>1.6</compilerVersion> 
           <source>1.6</source> 
           <target>1.6</target> 
           <optimize>true</optimize> 
          </configuration> 
          <dependencies> 
           <dependency> 
            <groupId>org.codehaus.plexus</groupId> 
            <artifactId>plexus-compiler-eclipse</artifactId> 
            <version>2.2</version> 
           </dependency> 
          </dependencies> 
         </plugin> 
    

im Plugins Abschnitt des Build-Abschnitt Ihrer pom .xml

2

Zuerst sollten wir die genaue Unterschrift des Verfahrens beachten erwartet umgesetzt werden soll:

<T> T[] toArray(T[] a); 

Und beide javac und Eclipse Sie warnen vor dieser ‚Typ Sicherheit‘ Thema. Und wenn Sie die Signatur ändern, um die erwartete zu sein, ist javac glücklich.

Wenn Sie eine @Override der Methode toArray setzen, auch mit der Signatur, die roh Object Typen verwenden, sowohl Eclipse und javac sieht es richtig als Überschreibung der von Collection erklärt Methode. Also dieses Problem ist nicht da.

Die Widersprüchlichkeit, und ich denke, der Fehler von javac, dh jede Unterklasse Implementierung ist, wird javac nicht die Super-Methode Object[] toArray(Object[] o) erkennen <T> T[] toArray(T[] a) zu implementieren. Wenn es für die abstrakte Klasse getan wird, sollte ich es auch für jede Unterklasse tun.

Es ist nicht das erste Mal javac hat einen Fehler darüber. Siehe zum Beispiel thread. Ich habe die Oracle Bug-Datenbank durchsucht, ich habe nichts über das gefunden, was Sie gefunden haben.

Dann gibt es eine Arbeit: Verwenden Sie in der Klasse abstrcat die erwartete Signatur; Oder haben die Überschreibung ‚manually` im subclasss:

public Object[] toArray(Object[] o) { 
    return super.toArray(o); 
} 
Verwandte Themen