Java 컴파일러의 동작이 완전히 이상합니다.
주기 일반 유형 관계과 관련된 경우 수퍼 유형을 하위 유형으로 캐스트 할 수 없습니다. 개미, 최신 자바 6 번들 내가 사용 넷빈즈 최신 트렁크 :자바 : 순환 제네릭 형식 관계가 상위 형식에서 캐스트를 허용하지 않습니다 (javac 버그)
public class _SupertypeGenericTest {
interface ISpace<S extends ISpace<S, A>, A extends IAtom<S, A>> {
}
interface IAtom<S extends ISpace<S, A>, A extends IAtom<S, A>> {
}
static class Space
implements ISpace<Space, Atom> {
}
static class Atom
implements IAtom<Space, Atom> {
}
public void test() {
ISpace<?, ?> spaceSupertype = new Space();
IAtom<?, ?> atomSupertype = new Atom();
Space space = (Space) spaceSupertype; // cast error
Atom atom = (Atom) atomSupertype; // cast error
}
}
컴파일러 에러 출력 :
_SupertypeGenericTest.java:33: inconvertible types
found : pinetag.data._SupertypeGenericTest.ISpace<capture#341 of ?,capture#820 of ?>
required: pinetag.data._SupertypeGenericTest.Space
Space space = (Space) spaceSupertype;
^
_SupertypeGenericTest.java:34: inconvertible types
found : pinetag.data._SupertypeGenericTest.IAtom<capture#94 of ?,capture#48 of ?>
required: pinetag.data._SupertypeGenericTest.Atom
Atom atom = (Atom) atomSupertype;
^
2 errors
주
JUnit 테스트 케이스 문제를 재현하는 방법 해제.
명령 줄에서 Ant를 사용하여 시도했습니다 (Netbeans가 build.xml 파일을 생성 함) 하지만 오류가 발생합니다.
무엇이 잘못 되었나요?
문제를 해결하는 우아한 방법이 있습니까?
이상한 점은 : Netbeans은 주어진 코드에서 오류 (심지어 경고는 표시하지 않음)를 표시하지 않습니다.
편집 :
아니, 지금은 아무것도을 이해하지!
Eclipse 3.4.1은 경고 나 오류를 표시하지 않으며, 문제없이 코드를 에 컴파일합니다!
어떻게 될 수 있습니까? 내 생각에, Netbeans에서 제공 한 build.xml과 함께 커맨드 라인에서 Ant를 사용하면 중립적이라고 생각했습니다.
뭔가 부족합니까?
편집 2 : JDK7 라이브러리와 JDK7 코드 형식을 사용
는 NetBeans는 오류/경고없이 컴파일!
(I은 1.7.0-EA-B55를 사용하고 있습니다)
편집 3 :
우리는 javac의 버그 상대하고 있음을 나타 내기 위해 제목을 변경.
어 - 오. 전에 ISpace 및 IAtom에서이 물건을 보지 못했습니까? 그리고 나는 그 중 하나를 이해할 수 없었다. –
좋습니다. 나는 * 그것을 * 전에 보았고, 그 이후로 더 복잡해졌습니다. –
그래, 그거야;) 순환 형 제네릭 형식 관계의 목적은 다음과 같습니다. '스페이스'가 강하게 입력 된 'Atoms'를 반환하고 'Atom'이 강력한 형식의 부모 ' 공간'. 또한, 많은 하위 유형 envolved ... 긴 이야기;) –