2009-10-23 5 views
3

편집 :이 모든 코드에 문제가되지 않을 밝혀졌다,하지만 그루비 이클립스 플러그인의 버그로 (http://jira.codehaus.org/browse/GRECLIPSE-373)메소드에 Java 애매한 유형이 있습니까?

Eclipse 나에게 자바 프로그램에서 모호한 유형에 대한 이상한 오류 메시지를주고있다 나는 왜 그런지 이해하지 못합니다. 반환 할 데이터 유형을 나타내는 일반 매개 변수를 사용하는 인터페이스가 있습니다. 그것의 구현

public interface InterfaceA<T> { 
    T getData(); 
} 

하나는 다음과 같습니다

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> { 
    public Collection<T> getData() { 
     // get the data 
    } 
} 

이는 "GetData의 모호"오류가 발생 수행 InterfaceA 형

public class Container<T extends InterfaceA> 
{ 
    private T a; 

    public Container(T a) { 
     this.a = a; 
    } 

    public T getA() { 
     return a; 
    } 
} 

의 컨테이너가있다.

Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>()); 
Collection<AnotherClass> coll = c.getA().getData(); 

나는 이것 하나에 난처한 상황에 처해있다.

+0

Eclipse에서이 문제가 보이지 않습니다. 3.4.2 JDK 1.6.0_10을 사용합니다. – Nate

+0

아마도 'AnotherClass'에 대한 세부 정보를 제공해야합니다. 방금'AnotherClass' 대신'java.util.Date' (비 최종적인)를 시도해 보았습니다. Eclipse에서 잘 컴파일됩니다. 'InterfaceA'에'interface'가없고'Impl'에'getData'가 공개되어 있어야합니다. –

+0

Eclipse 3.5를 JDK 1.6.0_16과 함께 사용하고 있지만 깨진 코드를 게시하지 않았다는 것을 깨달았습니다. 실제 문제로 코드를 업데이트했습니다. –

답변

5

Groovy의 플러그인에서이 문제를 일으키는 버그가 나타납니다. http://jira.codehaus.org/browse/GRECLIPSE-373. Java 문제는 전혀 아닙니다. 도움과 사과에 감사드립니다.

+0

이 질문을 포함하도록 질문을 편집 할 수 있습니까? – mkb

+0

나는 그 정보로 질문을 맨 위로 업데이트했다. –

+1

사과는 필요하지 않습니다. 귀하의 질문이 다른 사람에게 도움이 될 것입니다 (예를 들어, 나 같은).)) – jambriz

0

당신이 편집 한 예제가 제게는 잘 작동합니다 (JDK 1.5). 예외적으로, 생성자에 제네릭 형식을 정의해야합니다. Impl 요구에 정의

public interface InterfaceA<T> { 
    T getData(); 
} 

public static class Impl<T extends Date> implements InterfaceA<Collection<T>> { 
    public Collection<T> getData() { 
     return null; 
    } 
} 

public static class Container<T extends InterfaceA> { 
    private T a; 

    public Container(T a) { 
     this.a = a; 
    } 

    public T getA() { 
     return a; 
    } 

} 

public static void main(String[] args) { 
    Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>()); 
    Collection<Date> coll = c.getA().getData(); 
} 
2

Collection<T> getData()공공을 할 수있는 : 여기 내 전체 작업 코드입니다. 이 작업을 수행하면 코드가 정상적으로 컴파일됩니다.

+0

예, 죄송합니다. 복사/붙여 넣기 오류입니다. 게시 한 코드가 잘못되었음을 깨달았지만 문제가있는 코드로 업데이트했습니다. –

0

여기에있는 내용은 합법적 인 것으로 보입니다. 아마 Eclipse는 그렇지 않으면 안되는 오류를 보여줍니다.

Windows> 환경 설정> Java> 컴파일러> 오류/경고로 이동하십시오. "Generic Types"섹션에서 Eclipse가 나열된 작업 중 오류를보고하지 않는지 확인하십시오 (원하는 경우 제외). 나는 그 섹션에있는 모든 것을 "경고"로 설정했다. 그런 다음 프로젝트 새로 고침과 Eclipse 재시작을 시도합니다.

편집 : 업데이트 된 게시물을 만든 후에 "컨테이너가 원시 형식입니다. 일반 형식 컨테이너에 대한 매개 변수를 매개 변수화해야합니다 :"라는 경고가 표시됩니다 (오류가 아닙니다).

Container<Impl<Date>> c = new Container<Impl<Date>>(new Impl<Date>()); 

이 (내 예제에서, 나는 'AnotherClass'대신에로 java.util.Date를 사용하고 있습니다) : 이것은 해결할 수 있습니다.

+0

typo. –

+0

질문을 편집했습니다. 저를 위해 깔끔하게 컴파일하지 못했습니다. @ 인터페이스 메소드 구현을 오버라이드 할 수 없습니다. 대신 슈퍼 클래스 여야합니다. – Nate

+2

@Nate : 1.5를 사용 중입니다. Cuga는 1.6입니다. – alphazero

0

가 [편집 업데이트 된 질문을 반영하기]

당신이 범위를 패키지로 대중 방법의 가시성을 감소되므로이도 컴파일되지해야합니다

public class Impl<T extends AnotherClass> implements InterfaceA<Collection<T>> { 
    Collection<T> getData() { 
     // get the data 
    } 
} 

을 그리고이 여전히 컴파일 나를 위해 (Eclispe 3.4, OS X, 1.5), 그래서 정확하게 문제가 뭔지 모르겠다 :

패키지 temp.tests;

+0

감사합니다. 그루비/이클립스 플러그인과 관련된 답변을 게시했습니다. 그게 범인 이었어. –

+0

NP! 이를 질문에 대한 업데이트로 추가 할 수 있습니다. – alphazero

0

다른 포스터에서 말했듯이 JDK 1.6.0에서 실행되는 Eclipse 3.5.0에서는이 문제가 발생하지 않습니다.14 (getData() 방법의 축소 된 시정을 고정 할 때).

클린 빌드 (Eclipse의 Project/Clean)를 제안합니다. 또한 실행중인 Eclipse 및 Java 버전이 도움이 될 수 있습니다.

은 - Flaviu Cipcigan은

+0

문제를 올바르게 설명하는 코드를 업데이트했습니다. 그것은 여전히 ​​일식에서 깨지지만 javac 만 컴파일하면 작동하는 것 같습니다. –

관련 문제