2016-06-28 2 views
8

У меня есть эти классы:ява дженерики: ошибка компилятора не показано затмение

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 ошибочен.

Почему существует такая разница?

Здесь вы детали окружающей среды:

  • Затмения

    • Mars.2 релиз (4.5.2)
    • JDK 1.8.0_71
    • Компилятор уровень соответствия: 1,8
    • Errors/Warnings
  • Maven

    • Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T13: 57: 37 + 02: 00)
    • Maven дома: C: \ Разработка \ инструменты \ апач-Maven-3.3.3
    • Java Версия: 1.8.0_71, поставщика: Oracle Corporation
    • Java дома: C: \ Program Files \ Java \ jdk1.8.0_71 \ JRE
    • По умолчанию локали: it_IT, платформа кодирования: CP1252
    • название ОС: "Windows 10", версия: "10,0", арка: " amd64" , семья: "дОС"
    • 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> 
      

Вопрос: Как я могу выровнять затмение поведение компилятора JAVAC (но я не хочу использовать JAVAC в затмении)?

ответ

6

Это еще одно несоответствие между компилятором Java Eclipse и официальным компилятором JDK (because these are different indeed). И javac не всегда является игроком right в этой игре, вы действительно можете поразить ошибку javac, не встречающуюся в компиляторе Eclipse.

Об аналогичной проблеме уже сообщалось: Bug 456459: Discrepancy between Eclipse compiler and javac - Enums, interfaces, and generics.

Для выравнивания Maven с Eclipse, вы можете configure в maven-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. Процедура объясняется в переполнении стека q/a: How to run Javac from Eclipse.

+1

Спасибо, просто зная, что это ошибка ECJ. Я открыл сообщение об ошибке (https://bugs.eclipse.org/bugs/show_bug.cgi?id=496911). –

+0

@MicheleMariotti, спасибо за сообщение об ошибке. Как утверждалось там, я не уверен, что ecj ошибается. JLS 4.5 определяет корректность параметризованного типа путем захвата аргументов типа. Такой захват по определению соответствует верхним границам соответствующей переменной типа. Итак, как может 'cap # 1 extends glb (AbstractEntity, T)' нарушать ограничение 'extends AbstractEntity'? Этот тип может быть плохо сформирован противоречивыми границами (т. Е. Неопределенным glb), но я не вижу такого противоречия. Итак, почему компилятор отвергает это? –

+0

Что касается 'plexus-compiler-eclipse': я не уверен, как поддерживается этот плагин и какие версии ecj он втянет. Дополнительные советы по использованию ecj вне Eclipse собраны на https://wiki.eclipse.org/ JDT/FAQ # Can_I_use_JDT_outside_Eclipse_to_compile_Java_code.3F, который включает в себя возможность использовать tycho, который регулярно обновляет ecj-зависимость. –

 Смежные вопросы

  • Нет связанных вопросов^_^