방법에 대한 Java 모호한 유형?
-
06-07-2019 - |
문제
편집 : 이것은 코드에 전혀 문제가되지 않지만 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를 사용하고 있습니다).