Michele Mariotti
Michele Mariotti

Reputation: 7459

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:

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

Upvotes: 8

Views: 1392

Answers (1)

A_Di-Matteo
A_Di-Matteo

Reputation: 27812

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.

Upvotes: 6

Related Questions