Bonjour à tous,
J'ai une interface dans laquelle je déclare certains paramètres de méthodes basés sur les generics :
Qui convient aux classes clients avec toutes les classes implémentant InstanceNoeudItf ou l'interface InstanceNoeudItf elle-même. C'est l'objectif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); ... }
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)) :
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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); } ... }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Mais qui est refusé par les classes clientes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } ... }
Je tourne en rond ! C'est comme si InstanceNoeud n'implémentait pas InstanceNoeudItf.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); } ... }
Est-ce que quelqu'un comprend ce que je fais de travers, SVP ?
Merci d'avance.
Partager