Проблемы компиляции общего кода Java при сборке вне Eclipse - PullRequest
3 голосов
/ 23 января 2011

Я настроил сборку 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 - нет ??? (упс, Оракул не Солнце)

Ответы [ 2 ]

3 голосов
/ 23 января 2011

Попробуйте этот синтаксис:

Comparator<T> comparator = (Comparator<T>) ((SmartTable.ComparableColumn) column).comparator;

EDIT: Актерский состав бесполезен:

Comparator<T> comparator = ((SmartTable.ComparableColumn) column).comparator;

Это похоже на ваш сценарий?

public class Main {

    public static <T> void main(String[] args) throws Exception {
        SmartTable<T>.Column column = new SmartTable<T>().new Column();
        Comparator<T> comparator = ((SmartTable.ComparableColumn) column).comparator;

    }

    static class SmartTable<T> {
        class Column {

        }
        class ComparableColumn extends Column {
            Comparator<T> comparator;
        }
    }

}

Это прекрасно компилируется с javac (с непроверенными предупреждениями, конечно), а попытка скомпилировать приведение к (SmartTable.ComparableColumn) приводит именно к ошибкам в вашем посте.

РЕДАКТИРОВАТЬ (из всех правок): Кажется, ваш вопрос уже задавался ранее: Приведение к внутреннему классу с обобщениями , и, похоже, ответом является ошибка компилятора: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6665356

1 голос
/ 10 марта 2011

Используйте его следующим образом.Я имею в виду добавить следующий плагин непосредственно в файл pom.xml.

org.apache.maven.plugins maven-compiler-plugin 1.5 1.5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...