2016-06-28 152 views
8

未显示我有这些类:Java泛型:编译器错误在eclipse

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

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

    ... 
} 

我可以编译和食没有问题运行这段代码,但是当我调用mvn compile,引发此错误:

[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 

错误是不言自明的,理论上说,javac是正确的,eclipse编译器是错误的。

为什么会有这样的差异?

在这里,你是环境的详细信息:

  • 的Eclipse

    • Mars.2版本(4.5.2)
    • JDK 1.8.0_71
    • 编译器合规水平: 1.8
    • Errors/Warnings
  • 的Maven

    • 阿帕奇的Maven 3.3.3(7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T13:57:37 + 02:00)
    • Maven的家:C:\开发\工具\ Apache的行家-3.3.3
    • Java版本:1.8.0_71,供应商:Oracle公司
    • Java主页:C:\ Program Files文件\的Java \ jdk1.8.0_71 \ jre的
    • 默认区域:it_IT,平台编码:
    • 的Cp1252
    • 操作系统名称: “窗口10” 版本: “10.0”,拱“ AMD64" 技术,家人: “DOS”
    • Maven的编译器插件:

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

问题:我怎样才能对准 Eclipse编译器行为javac的(但我不想在Eclipse中使用javac)?

回答

6

这是Eclipse Java编译器和官方JDK编译器(because these are different indeed)之间的又一次不匹配。并且javac并不总是这个游戏中的right actor,你确实可以碰到Eclipse编译器中没有发生的javac错误。

一个类似的问题已经被报道:Bug 456459: Discrepancy between Eclipse compiler and javac - Enums, interfaces, and generics

要与Eclipse对齐Maven的时候,你可以configuremaven-compiler-plugin如下:

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

基本上,你告诉Maven来使用Eclipse Java编译器。我能够重现您的问题,然后应用Maven构建的这种配置就没有问题。但是,我不会推荐这种方法。另一方面,要配置Eclipse以使用JDK编译器则有点困难,这基本上是因为Eclipse编译器是IDE功能的组成部分。一个过程在Stack Overflow中解释q/a:How to run Javac from Eclipse

+1

谢谢,只知道这是一个ECJ错误就足够了。我打开了一个[bug报告](https://bugs.eclipse.org/bugs/show_bug.cgi?id=496911)。 –

+0

@MicheleMariotti,感谢您的错误报告。正如那里所说,我不相信ecj是错的。 JLS 4.5通过捕获类型参数来定义参数化类型的格式。根据定义,这种捕获符合相应类型变量的上限。那么,cap#1如何扩展glb(AbstractEntity,T)'违反了绑定'extends AbstractEntity'?这种类型可能是由矛盾界限(即未定义的glb)形成的,但我没有看到任何这样的矛盾。那么,编译器为什么要拒​​绝呢? –

+0

关于'plexus-compiler-eclipse':我不确定这个插件是如何维护的,以及它将引入哪个版本的ecj。有关在Eclipse之外使用ecj的更多提示,请参阅https://wiki.eclipse.org/ JDT/FAQ#Can_I_use_JDT_outside_Eclipse_to_compile_Java_code.3F其中包含使用tycho的选项,它可以非常有规律地更新ecj-dependency。 –