2016-06-28 167 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。 –