Me encuentro con un comportamiento totalmente extraño del compilador de Java.
No puedo lanzar un supertipo a un subtipo cuando tipo genérico cíclico relación está involucrado.Java: la relación de tipo genérica cíclica no permite la conversión del supertipo (error javac)
test JUnit para reproducir el problema:
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
}
}
compilador de salida de 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
Nota: estoy usando Netbeans última tronco, incluido Hormiga, última versión de Java 6 lanzamiento.
Intenté usar Ant desde la línea de comandos (Netbeans genera un archivo build.xml) pero da como resultado los mismos errores.
¿Qué pasa?
¿Hay una forma elegante de resolver el problema?
Lo extraño es que Netbeans no marca errores (ni siquiera advertencias) en el código dado.
EDIT:
No, ahora entiendo nada !
Eclipse 3.4.1 no marca advertencias ni errores, y compila el código sin problemas !!!
¿Cómo puede ser esto? Pensé que usar Ant de la línea de comando junto con build.xml proporcionado por Netbeans sería neutral.
¿Me estoy perdiendo algo?
EDIT 2:
Usando JDK7 biblioteca y el código JDK7 formato, netbeans se compila sin errores/advertencias !
(estoy usando 1.7.0-ea-b55)
Datos 3:
cambió de título para indicar que estamos tratando con un error javac.
Uh-oh. ¿No he visto esto antes con ISpace y IAtom? Y tampoco pude entenderlo. –
Genial. Lo * he visto antes, y se ha vuelto más complicado desde entonces. –
Sí, esa soy yo otra vez;) El propósito de dicha relación cíclica de tipo genérico es: quiero hacer que el 'Espacio' pueda devolver 'Átomos' fuertemente tipados, y hacer que el 'Átomo' pueda devolver un padre fuertemente tipado ' Espacio'. Además, hay muchos subtipos envueltos ... Larga historia;) –