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:
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>{...}
Je cherche à faire une class pour contenir une liste de FieldComponent herittant de FieldListItem.
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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
public abstract class FieldListComponent<T extends FieldComponent> extends FieldListItem<FieldListComponent<T>, T>{...}
Or le compilateur me dit que type T (en rouge) n'est pas compatible:
"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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
public abstract class FieldListComponent<T extends FieldItem<T, FieldPoint>> extends FieldListItem<FieldListComponent<T>, T>{...}
Toutefois cette définition m'impose de "caster" toute mes méthodes utilisant des FieldItem<T, FieldPoint> en FieldComponent.
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.