2016-06-28 63 views
8

ho queste classi:generici Java: errore del compilatore non mostrato in eclisse

public class EntityDataModel<T extends AbstractEntity> 
{ 
    ... 
} 

public abstract class BarChartBean<E extends ChartEntry, T> 
{ 
    protected EntityDataModel<? extends T> currentModel; 

    ... 
} 

posso compilare ed eseguire il codice su Eclipse senza problemi, ma quando invoco mvn compile, questo errore viene generato:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.5.1:compile (default-compile) on project edea2: Compilation failure: Compilation failure: 
[ERROR] C:\Develop\...\BarChartBean.java:[53,30] error: type argument ? extends T#1 is not within bounds of type-variable T#2 
[ERROR] where T#1,T#2 are type-variables: 
[ERROR] T#1 extends Object declared in class BarChartBean 
[ERROR] T#2 extends AbstractEntity declared in class EntityDataModel 

L'errore è abbastanza auto-esplicativo e, teoricamente parlando, javac è giusto e il compilatore di Eclipse è sbagliato.

Perché c'è una tale differenza?

Ecco i dettagli dell'ambiente:

  • Eclipse

    • Mars.2 di rilascio (4.5.2)
    • JDK 1.8.0_71
    • Compiler livello di conformità: 1.8
    • Errors/Warnings
  • Maven

    • Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T13: 57: 37 + 02: 00)
    • Maven casa: C: \ Develop \ tools \ apache-3.3.3-Maven
    • versione di Java: 1.8.0_71, fornitore: Oracle Corporation
    • Java casa: C: \ Program Files \ Java \ jdk1.8.0_71 \ jre
    • default locale: it_IT, codifica piattaforma: Cp1252
    • nome del sistema operativo: "Windows 10", versione: "10.0", arch: " amd64" , la famiglia: "dos"
    • Maven-compiler-plugin:

      <plugin> 
          <artifactId>maven-compiler-plugin</artifactId> 
          <version>2.5.1</version> 
          <configuration> 
           <source>1.8</source> 
           <target>1.8</target> 
           <encoding>UTF-8</encoding> 
           <showDeprecation>true</showDeprecation> 
           <showWarnings>true</showWarnings> 
          </configuration> 
      </plugin> 
      

Domanda: Come posso allineare il comportamento del compilatore Eclipse per javac (ma non voglio usare javac in Eclipse)?

risposta

6

Questo è ancora un altro disallineamento tra il compilatore Java Eclipse e il compilatore JDK ufficiale (because these are different indeed). E javac non è sempre l'attore right in questo gioco, si può effettivamente colpire un errore javac che non si verifica nel compilatore Eclipse.

Un problema simile è già stato segnalato: Bug 456459: Discrepancy between Eclipse compiler and javac - Enums, interfaces, and generics.

Per allineare Maven con Eclipse, è possibile configure il maven-compiler-plugin come segue:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <version>3.5.1</version> 
    <configuration> 
     <source>1.8</source> 
     <target>1.8</target> 
     <compilerId>eclipse</compilerId> 
    </configuration> 
    <dependencies> 
     <dependency> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-compiler-eclipse</artifactId> 
      <version>2.7</version> 
     </dependency> 
    </dependencies> 
</plugin> 

In sostanza, si indica Maven di utilizzare il compilatore Eclipse Java. Sono riuscito a riprodurre il problema e ad applicare questa configurazione la build di Maven andava bene.Tuttavia, non consiglierei questo approccio.

D'altra parte, configurare Eclipse per utilizzare il compilatore JDK è un po 'più difficile, in pratica perché il compilatore Eclipse fa parte delle funzionalità IDE. Una procedura è spiegata in Stack Overflow q/a: How to run Javac from Eclipse.

+1

Grazie, sapere che è un errore ECJ è sufficiente. Ho aperto un [bug report] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=496911). –

+0

@MicheleMariotti, grazie per il bug report. Come sostenuto qui, non sono convinto che ecj sia sbagliato. JLS 4.5 definisce la ben formata di un tipo parametrizzato tramite l'acquisizione degli argomenti di tipo. Tale acquisizione per definizione è conforme ai limiti superiori della corrispondente variabile di tipo. Quindi, come può 'cap # 1 estende glb (AbstractEntity, T)' viola il limite 'estende AbstractEntity'? Questo tipo potrebbe essere mal formato da limiti contraddittori (cioè glutei non definiti), ma non vedo alcuna contraddizione del genere. Quindi, perché un compilatore dovrebbe rifiutarlo? –

+0

Per quanto riguarda 'plexus-compiler-eclipse': Non sono sicuro di come si manterrà questo plugin e quali versioni di ecj introdurranno. Ulteriori suggerimenti sull'utilizzo di ecj all'esterno di Eclipse sono raccolti su https://wiki.eclipse.org/ JDT/FAQ # Can_I_use_JDT_outside_Eclipse_to_compile_Java_code.3F che include l'opzione per usare tycho, che aggiorna la dipendenza da ecj abbastanza regolarmente. –