2013-06-11 22 views
7

Questo compila trovare usando Eclipse:come mai Eclipse compila questo codice Java ma non 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(); 
     } 
    } 

ma non riesce a compilare quando si utilizza Ant:

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

posso capire perché il codice sarebbe compilare utilizzando Eclipse: keyset eredita già l'attuazione del toArray (T []) metodo da CollectionView.

Ma perché non riesce quando compilo usando Ant?

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

Questo è difficile. Ci deve essere qualche differenza nelle dipendenze o nell'ordine di dipendenza? – djangofan

+0

non sicuro. ma entrambe le classi sono classi interne della stessa classe. –

+0

La classe che racchiude implementa 'toArray()'? –

risposta

1

Ci sono diversi casi in cui Eclipse compila bene e javac non lo fa. Se non ti dispiace, ci sono tre modi che conosco per costruire usando il compilatore di eclipse.

  1. pacchetto eclipse classi pre-compilati (hacky, non raccomandato)

  2. utilizzare l'adattatore eclissi compilatore con Ant. Quando si specifica la proprietà build.compiler, tutte le attività javac d'ora in poi saranno interessate dal build di Ant. Puoi impostarlo su "org.eclipse.jdt.core.JDTCompilerAdapter". Nota che dovrai includere questa classe (e le classi da cui dipende) nel tuo classpath di classe ant build. Il modo più semplice è quello di aggiungere i vasi necessari nella cartella lib dell'installazione Ant

  3. Quando si costruisce con Maven configurare questo

     <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> 
    

nella sezione plugin della sezione di accumulo del pom .xml

2

Per prima cosa deve tener conto della firma esatto del metodo previsto da attuare è:

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

Ed entrambi javac ed Eclipse si fa a mettere in guardia su questo problema 'Tipo di sicurezza'. E se cambi la firma per essere quella prevista, javac è felice.

Se si mette un @Override al metodo toArray, anche con la firma che utilizzano prime Object tipo, sia Eclipse e javac correttamente vederlo come un override del metodo dichiarato da Collection. Quindi questo problema non è lì.

L'incoerenza, e credo che il bug di javac, è che è qualsiasi implementazione sottoclasse, javac non riconosce il metodo eccellente Object[] toArray(Object[] o) per implementare <T> T[] toArray(T[] a). Se lo fosse per la classe astratta, dovrei farlo anche per ogni sottoclasse.

Non è la prima volta che javac ha un bug su questo. Vedi questo thread per esempio. Ho cercato il database dei bug di Oracle, non ho trovato nulla di riferito su ciò che hai trovato.

Quindi ci sono dei problemi: nella classe abstrcat, usare la firma prevista; O fare il 'manually` sostituzione nel subclasss:

public Object[] toArray(Object[] o) { 
    return super.toArray(o); 
} 
Problemi correlati