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
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)?
Grazie, sapere che è un errore ECJ è sufficiente. Ho aperto un [bug report] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=496911). –
@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? –
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. –