Bonjour à tous,
Je vous sollicite pour un point sur l'utilisation des generic en JAVA qui m'agace un peu .
Voici la structure de mes class:
Je cherche à faire une class pour contenir une liste de FieldComponent herittant de FieldListItem.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public abstract class FieldItem <S extends FieldItem<S,T>, T extends FieldData> extends PrimitiveShape implements FieldData, ItemGroup<Long>, Cloneable{...} public class FieldComponent extends FieldItem<FieldComponent, FieldPoint>{...} public class FieldPlanar extends FieldComponent {...} public abstract class FieldListItem <S extends FieldListItem<S,T>, T extends FieldItem<T, ?>> extends FieldItem<S,T>{...}
Puis une autre class pour contenir une liste de FieldPlanar héritant de cette dernière class (d'où le generic en paramètre de cette class)
Voici ce que j'aimerai donc écrire:
Or le compilateur me dit que type T (en rouge) n'est pas compatible:
Code : Sélectionner tout - Visualiser dans une fenêtre à part public abstract class FieldListComponent<T extends FieldComponent> extends FieldListItem<FieldListComponent<T>, T>{...}
"Bound mismatch: The type T is not a valid substitute for the bounded parameter <T extends FieldItem<T,?>> of the type FieldListItem<S,T>"
J'arrive à comprendre pourquoi (même si je trouve cela chiant ).
Le type T attendu doit être un type T extends FieldItem<T, FieldPoint> or je lui donne un type T extends FieldComponent qui est un FieldItem<FieldComponent, FieldPoint>.
Donc il voit que le Type T sera différent de FieldComponent même si il en hérite.
Le problème vient du fait de la déclaration de mon type FieldListItem qui a en deuxième paramètre généric T extends FieldItem<T, ?>.
Même si je pense avoir isolé le problème je n'ai pas de solution. Ou du moins pas convenable.
Voici ce que pourait faire:
Toutefois cette définition m'impose de "caster" toute mes méthodes utilisant des FieldItem<T, FieldPoint> en FieldComponent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part public abstract class FieldListComponent<T extends FieldItem<T, FieldPoint>> extends FieldListItem<FieldListComponent<T>, T>{...}
Or c'est un peu le but d'utiliser les generic d'éviter ce travail.
Merci d'avance pour toute information pouvant me faire avancer sur ce problème.
Sébastien.
Partager