Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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
    • Errors/Warnings
  • 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)?

like image 331
Michele Mariotti Avatar asked Jun 28 '16 07:06

Michele Mariotti


1 Answers

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.

like image 85
A_Di-Matteo Avatar answered Oct 11 '22 12:10

A_Di-Matteo