简体   繁体   中英

java generics: compiler error not shown in eclipse

I have these classes:

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

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

    ...
}

I can compile and run this code on eclipse without problem, but when I invoke mvn compile , this error is thrown:

[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

The error is pretty self-explanatory, and theoretically speaking, javac is right and eclipse compiler is wrong.

Why there's such a difference?

Here you are the details of the environment:

  • Eclipse

    • Mars.2 Release (4.5.2)
    • jdk 1.8.0_71
    • Compiler compliance level: 1.8
    • 错误/警告
  • Maven

    • Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T13:57:37+02:00)
    • Maven home: C:\\Develop\\tools\\apache-maven-3.3.3
    • Java version: 1.8.0_71, vendor: Oracle Corporation
    • Java home: C:\\Program Files\\Java\\jdk1.8.0_71\\jre
    • Default locale: it_IT, platform encoding: Cp1252
    • OS name: "windows 10", version: "10.0", arch: "amd64", family: "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> 

Question : How can I align the eclipse compiler behavior to javac (but I don't want to use javac in eclipse)?

That's yet another mismatch between the Eclipse Java compiler and the official JDK compiler (because these are different indeed) . And javac is not always the right actor in this game, you can indeed hit a javac bug not occurring in the Eclipse compiler.

A similar issue has already been reported: Bug 456459 : Discrepancy between Eclipse compiler and javac - Enums, interfaces, and generics .

To align Maven with Eclipse, you can configure the maven-compiler-plugin as following:

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

Basically, you are telling Maven to use the Eclipse Java compiler. I was able to reproduce your issue and applying this configuration the Maven build was then fine. However, I would not recommend this approach.

On the other hand, to configure Eclipse to use the JDK compiler is a bit more difficult, basically because the Eclipse compiler is part of the IDE features. A procedure is explained in the Stack Overflow q/a: How to run Javac from Eclipse .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM