Я настроил сборку Maven для очень маленького проекта GWT, который у меня есть. Компиляция / запуск из Eclipse не вызывает проблем, но когда я выполняю сборку Maven, у меня возникают проблемы с компиляцией в одном месте (это код GWT «на стороне клиента», но я не уверен, что это так). Maven / вывод компиляции:
[..]SmartTable.java:[63,52] ')' expected
[..]SmartTable.java:[63,53] ')' expected
[..]SmartTable.java:[63,69] ';' expected
[..]SmartTable.java:[63,71] not a statement
[..]SmartTable.java:[63,77] ';' expected
[..]SmartTable.java:[63,79] not a statement
.. где эта конкретная строка определяется следующим образом:
final Comparator<T> comparator = ((SmartTable<T>.ComparableColumn) column).comparator;
Как вы уже догадались, я перебираю все столбцы, определенные для этого обобщенного класса (который я называю «SmartTable»), и получаю компаратор (конечно, если это столбец instanceof SmartTable.ComparableColumn) для дальнейших операций.
Классы Column и ComparableColumn вложены в SmartTable, а их заголовки выглядят следующим образом:
public abstract class Column {
// private String id;
private String caption;
private int width;
private Filter<T> filter;
...
public class ComparableColumn extends Column {
private Comparator<T> comparator;
...
Когда он скомпилирован из Eclipse, у меня нет проблем с упаковкой WAR (без 'clean' - просто с пакетом, который будет работать, поскольку Eclipse настроен на размещение файлов .class в том же каталоге назначения, который используется Maven) и развертыванием / запуском правильно.
Я уже пытался изменить maven-compiler-plugin и конфигурацию (настройки значений 1.5, 1.6 и 1.4 - ради эксперимента, чтобы посмотреть, начнет ли он жаловаться на дженерики в целом), но это не помогло , Соответствие компилятору проекта Eclipse по умолчанию (1.6). Кажется, у меня нет других проблем компиляции с другим универсальным кодом.
Пытался сделать его как можно короче, но не уверен, что мне удалось сделать это хорошо:)
РЕДАКТИРОВАТЬ: больше кода по требованию
public class SmartTable<T> extends FlexTable {
private List<Column> columns = new ArrayList<Column>();
...
private Comparator<T> currentComparator;
...
public void init(Comparator<T> defaultComparator) {
this.currentComparator = defaultComparator;
...
int index = 0;
for (Column column : columns) {
...
if (column instanceof SmartTable.ComparableColumn) {
@SuppressWarnings("unchecked")
final Comparator<T> comparator = ((SmartTable<T>.ComparableColumn) column).comparator;
...
}
...
public abstract class Column {
// private String id;
private String caption;
private int width;
private Filter<T> filter;
private List<WidgetCreator<T>> widgetCreators;
public Column(/* String id, */String caption, int width, Filter<T> filter, List<WidgetCreator<T>> widgetCreators) {
...
public class SimpleColumn extends Column {
public SimpleColumn(/* String id, */String caption, int width, Filter<T> filter, List<WidgetCreator<T>> widgetCreators) {
super(/* id, */caption, width, filter, widgetCreators);
}
...
public class ComparableColumn extends Column {
private Comparator<T> comparator;
public ComparableColumn(/* String id, */String caption, int width, Filter<T> filter,
List<WidgetCreator<T>> widgetCreators, Comparator<T> comparator) {
super(/* id, */caption, width, filter, widgetCreators);
this.comparator = comparator;
}
...
}
РЕДАКТИРОВАТЬ 2: Актуальная проблема, кажется, очень концентрированным:)
public class SmartTable2<T> {
public void init() {
Column c = new ComparableColumn();
final Comparator<T> comparator = ((SmartTable2<T>.ComparableColumn) c).comparator;
}
class Column {
}
class ComparableColumn extends Column {
Comparator<T> comparator;
}
}
EDIT3: Некоторые мысли, надеюсь, ближе к решению
.. так что это не компилируется просто с javac, выдает точно такие же ошибки компиляции. Итак, что я узнал только сейчас: Eclipse использует свой собственный внутренний компилятор Java - который является частью JDT Core (надеюсь, я не понял его неправильно); может ли быть так, что JDT Compiler способен компилировать такой синтаксис, а Sun JDK Javac - нет ??? (упс, Оракул не Солнце)