Je rencontre un comportement totalement étrange du compilateur Java.
Je ne peux pas convertir un supertype en un sous-type lorsque le type générique cyclique relation est impliqué.Java: La relation de type générique cyclique n'autorise pas la conversion de supertype (bug javac)
cas de test JUnit pour reproduire le problème:
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
}
}
sortie d'erreur du compilateur:
_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
Note: J'utilise Netbeans le dernier tronc, livré Ant, dernière version de Java 6 Libération.
J'ai essayé d'utiliser Ant à partir de la ligne de commande (Netbeans génère un fichier build.xml) mais il en résulte les mêmes erreurs.
Qu'est-ce qui ne va pas?
Existe-t-il une manière élégante de résoudre le problème?
La chose étrange est: Netbeans ne marque pas les erreurs (pas même les avertissements) dans le code donné.
EDIT:
Non, je comprends maintenant rien!
Eclipse 3.4.1 ne marque ni les avertissements ni les erreurs, et compile le code sans problème !!!
Comment cela peut-il être? Je pensais, en utilisant Ant de la ligne de commande avec build.xml fourni par Netbeans serait neutre.
Ai-je raté quelque chose?
EDIT 2:
L'utilisation bibliothèque JDK7 et le format de code JDK7, NetBeans compile sans erreurs/avertissements!
(J'utilise 1.7.0-ea-B55)
EDIT 3:
Changé titre pour indiquer que nous avons affaire à un bug de javac.
Uh-oh. N'ai-je pas déjà vu ça avec ISpace et IAtom auparavant? Et je ne pouvais pas le comprendre alors non plus. –
Super. Je l'ai déjà vu, et c'est devenu plus compliqué depuis. –
Ouais, c'est encore moi;) Le but de cette relation de type générique cyclique est: Je veux rendre le 'Espace' capable de renvoyer des 'Atomes' fortement typés, et rendre 'Atom' capable de renvoyer un parent fortement typé ' Espace'. En outre, il y a beaucoup de sous-types envolés ... Longue histoire;) –