[generics] pb d'implémentation d'une itf
Bonjour à tous,
J'ai une interface dans laquelle je déclare certains paramètres de méthodes basés sur les generics :
Code:
1 2 3 4 5 6 7 8 9 10
|
public interface Visitor<N extends InstanceNoeudItf> {
void visit(N noeud);
}
public interface InstanceNoeudItf {
void accept(Visitor<? extends InstanceNoeudItf> visitor);
...
} |
Qui convient aux classes clients avec toutes les classes implémentant InstanceNoeudItf ou l'interface InstanceNoeudItf elle-même. C'est l'objectif.
Mais impossible de compiler mon implémentation (The method visit(capture#1-of ? extends InstanceNoeudItf) in the type Visitor<capture#1-of ? extends InstanceNoeudItf> is not applicable for the arguments (InstanceNoeud)) :
Code:
1 2 3 4 5 6 7 8
|
public class InstanceNoeud extends BasicInstanceNoeud implements InstanceNoeudItf {
...
public void accept(Visitor<? extends InstanceNoeudItf> visitor) {
visitor.visit(this);
}
...
} |
J'ai essayé de déclarer mon implémentation de #accept de différentes façons, sans succès (violation de la signature de l'interface héritée) :
Code:
1 2 3 4 5
|
public void accept(Visitor<InstanceNoeudItf> visitor) {
...
public void accept(Visitor<InstanceNoeud> visitor) {
... |
Du coup, j'ai déclaré ceci, qui compile :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
public interface InstanceNoeudItf {
void accept(Visitor<InstanceNoeudItf> visitor);
...
}
public class InstanceNoeud extends BasicInstanceNoeud implements InstanceNoeudItf {
public void accept(Visitor<InstanceNoeudItf> visitor) {
visitor.visit(this);
}
...
} |
Mais qui est refusé par les classes clientes :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public class CalculAffichageVisitor implements Visitor<InstanceNoeud> {
...
public void visit(InstanceNoeud noeud) {
...
}
...
public static void initialiser(InstanceNoeud racine) {
CalculAffichageVisitor visitor = new CalculAffichageVisitor();
racine.accept(visitor);
}
...
} |
Je tourne en rond ! C'est comme si InstanceNoeud n'implémentait pas InstanceNoeudItf.
Est-ce que quelqu'un comprend ce que je fais de travers, SVP ?
Merci d'avance.
ah ah, j'crois que j'tiens un truc, là
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
public class ExtractionVariablesVisitor<T extends InstanceNoeudItf<T>> implements Visitor<T> {
public void visit(T noeud) {
...
}
}
public static <T extends InstanceNoeudItf<T>> String getExpandedName(T noeud) {
// extrait les variables du sous arbre
ExtractionVariablesVisitor<T> extracteur = new ExtractionVariablesVisitor<T>();
noeud.accept(extracteur);
...
} |
En même temps, tu m'avais bien dit que ça serait dur à relire ! :mouarf: