【发布时间】:2011-01-22 22:01:07
【问题描述】:
我已经为我拥有的一个非常小的 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”),并获取一个比较器(当然,如果列 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(没有“干净” - 简单的包,因为 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不能? (哎呀,Oracle 不是 Sun)
【问题讨论】: