2011-01-22 4 views
3

매우 작은 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은 그렇지 않다. (죄송합니다, 오라클은 썬되지 않음)

+0

가능한 중복 : // 유래 .com/questions/4156705/casting-to-an-class-with-generics) – finnw

답변

3

이 구문을 시도해보십시오

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

편집 : 캐스팅 쓸모가 :

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

이이 시나리오를 닮은합니까? 게시물에 정확히 오류 (SmartTable.ComparableColumn) 결과 캐스트를 컴파일하는 동안

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의 괜찮 컴파일합니다.(모든 편집의)

편집 : 귀하의 질문은 전에 요청을받은 것으로 보인다 : Casting to an inner class with generics 대답은 컴파일러의 버그가 될 것으로 보인다 : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6665356

+0

다른 컴파일 오류가 발생합니다 (GWT 사후 컴파일 오류라고 생각합니다) : [INFO] 새로 컴파일 된 단위의 유효성 검사 [정보] [ERRO [정보] [오류] 줄 63 : SmartTable 에서 열 수 없습니다. 열을 SmartTable.ComparableColumn –

+0

흠 ... 을 (를) 제거하십시오. 오류 : '파일 :/D :/[..]/SmartTable.java' SmartTable .Column declaration above ... 그러나 동일한 클래스 선언을 사용하는 컴퓨터에서는 잘 컴파일됩니다. 이 캐스팅 문제는 확인되지 않은 경고 일뿐입니다 ... –

+0

코드 (편집 후 제안 된대로) : 최종 비교 자 비교 자 = ((SmartTable.ComparableColumn) 열) .comparator; 출력 : [정보] [오류] 줄 63 : SmartTable에서 캐스팅 할 수 없습니다 .Column to SmartTable.ComparableColumn –

1

는 그것을 다음과 같은 방법을 사용합니다. 다음 플러그인을 pom.xml 파일에 직접 추가하는 것을 의미합니다. (HTTP를 [제네릭 내부 클래스에 캐스팅]의

org.apache.maven.plugins 받는다는 - 컴파일러 플러그인 1.5 1.5

관련 문제