매우 작은 GWT 프로젝트에 대해 Maven 빌드를 구성했습니다. Eclipse에서 컴파일/실행해도 아무런 문제가 없지만 Maven 빌드를 실행하면 한 곳에서 컴파일 문제가 발생합니다 (GWT의 '클라이언트 측'코드이지만이 경우에는 확실하지 않습니다). 메이븐/컴파일 출력이 특정 라인은 다음과 같이 정의Eclipse 외부에서 빌드 할 때 Java generics 코드 컴파일 문제가 발생했습니다.
[..]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;
, 나는이 제네릭 클래스에 정의 된 모든 열을 이상 반복하고있어 (이 I 'SmartTable'호출), 그리고 비교 연산 (SmartTable.ComparableColumn의 열 인스턴스 인 경우)을 추가 작업에 사용합니다. 클래스 '열'과 '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;
...
, 내가 '깨끗한'없이 (포장 WAR에 아무런 문제가 없다 - 단순히 패키지를 Maven이 사용하는 동일한 대상 디렉토리에 .class 파일을 배치하고 올바르게 배치/실행하도록 Eclipse를 구성한 이후 작동합니다.
필자는 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을 : 일부 생각, 희망에 가까운 솔루션 .. 그래서 이것은 정확히 같은 컴파일 오류를 throw javac 함께 컴파일되지 않습니다. 그래서 지금 막 배웠던 것 : 이클립스는 JDT 코어의 일부인 내부 자바 컴파일러를 사용한다. (필자가 잘못 이해하지 않았 으면 좋겠다.) 그래서 JDT 컴파일러가 그런 구문을 컴파일 할 수있는 반면, Sun의 JDK javac은 그렇지 않다. (죄송합니다, 오라클은 썬되지 않음)
가능한 중복 : // 유래 .com/questions/4156705/casting-to-an-class-with-generics) – finnw