在Eclipse之外构建时,Java泛型代码编译问题

时间:2011-01-22 22:01:07

标签: java eclipse gwt

我为一个非常小的GWT项目配置了一个Maven构建。从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')定义的所有列,并获取比较器(当然,如果是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;
        }

...

}

EDIT2:实际问题似乎非常集中:)

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编译器能够编译这样的语法,而Sun的JDK javac不是??? (oops,Oracle而不是Sun)

2 个答案:

答案 0 :(得分:3)

试试这个语法:

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

编辑: 演员没用:

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)会导致帖子中出现错误。

编辑(所有编辑内容): 您的问题似乎在之前被问过:Casting to an inner class with generics并且答案似乎是编译错误:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6665356

答案 1 :(得分:1)

以下列方式使用它。我的意思是将以下插件直接添加到pom.xml文件中。

               org.apache.maven.plugins     Maven的编译器插件               1.5        1.5