У меня есть эти классы:ява дженерики: ошибка компилятора не показано затмение
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 ошибочен.
Почему существует такая разница?
Здесь вы детали окружающей среды:
Затмения
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 в затмении)?
Спасибо, просто зная, что это ошибка ECJ. Я открыл сообщение об ошибке (https://bugs.eclipse.org/bugs/show_bug.cgi?id=496911). –
@MicheleMariotti, спасибо за сообщение об ошибке. Как утверждалось там, я не уверен, что ecj ошибается. JLS 4.5 определяет корректность параметризованного типа путем захвата аргументов типа. Такой захват по определению соответствует верхним границам соответствующей переменной типа. Итак, как может 'cap # 1 extends glb (AbstractEntity, T)' нарушать ограничение 'extends AbstractEntity'? Этот тип может быть плохо сформирован противоречивыми границами (т. Е. Неопределенным glb), но я не вижу такого противоречия. Итак, почему компилятор отвергает это? –
Что касается '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-зависимость. –