문제

편집 : 이것은 코드에 전혀 문제가되지 않지만 Groovy Eclipse 플러그인의 버그가 있습니다 (http://jira.codehaus.org/browse/greclipse-373)

Java 프로그램에서 모호한 유형에 대한 이상한 오류 메시지를 제공하고 있으며 그 이유를 정말로 이해하지 못합니다. 반환하는 데이터 유형을 나타내는 일반 매개 변수를 사용하는 인터페이스가 있습니다.

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

IT의 구현 중 하나는 다음과 같습니다.

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

계면을위한 컨테이너도 있습니다

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

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

    public T getA() {
        return a;
    }
}

이렇게하면 "getData는 모호합니다"오류가 발생합니다.

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

나는 이것에 머물러있다.

도움이 되었습니까?

해결책

그루비 플러그인에서이를 일으키는 버그가있는 것으로 보입니다. http://jira.codehaus.org/browse/greclipse-373. 그것은 전혀 자바 문제가 아닙니다. 도움과 사과 주셔서 감사합니다.

다른 팁

Collection<T> getData() 정의되었습니다 Impl 만들어야합니다 공공의. 이 작업을 수행하면 코드가 깨끗하게 컴파일됩니다.

다른 포스터가 말했듯이, 나는 JDK 1.6.0.14에서 실행되는 Eclipse 3.5.0 에서이 문제를보고 있지 않습니다 (감소 된 가시성을 수정할 때 getData() 방법).

깨끗한 빌드 (Eclipse에서 프로젝트/클린)를하는 것이 좋습니다. 또한 실행중인 Eclipse 및 Java 버전이 도움이 될 수 있습니다.

- flaviu cipcigan

편집 된 예제는 제작자의 일반 유형을 정의해야한다는 예외 (JDK 1.5)에게 잘 작동합니다 (JDK 1.5). 다음은 내 전체 작업 코드입니다.

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();
}

업데이트 된 질문을 반영하기 위해 편집

방법의 가시성을 공개에서 패키지 범위로 줄이면서도 컴파일해서는 안됩니다.

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;

import java.util.Collection;

public interface InterfaceA <T> {

    T getData();

    public static final class AnotherClass {}

    public static final class Impl<T extends AnotherClass> 
             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 final class Test {
        public static void main (String[] args) {
            Container<Impl<AnotherClass>> c = new Container(new Impl<AnotherClass>());
            Collection<AnotherClass> coll = c.getA().getData();
        }
    }
}

당신이 여기있는 것은 합법적 인 것 같습니다. 아마도 Eclipse는 그렇지 않은 오류가 표시되지 않을 것입니다.

Windows> 환경 설정> Java> 컴파일러> 오류/경고로 이동하십시오. "일반 유형"섹션에서 Eclipse가 나열된 작업에 대한 오류를보고하지 않도록하십시오 (원하지 않는 한). 나는 그 섹션의 모든 것이 "경고"로 설정되어 있습니다. 그런 다음 프로젝트를 새로 고치고 일식을 다시 시작하려고합니다.

편집 : 업데이트 된 게시물이 작성된 후, "컨테이너는 원시 유형입니다. 일반 유형 컨테이너에 대한 참조는 매개 변수화되어야합니다." 이것은 다음과 같이 수정할 수 있습니다.

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

(내 예에서는 '다른 클래스'대신 java.util.date를 사용하고 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top