Bonjour à tous,

J'ai une interface dans laquelle je déclare certains paramètres de méthodes basés sur les generics :

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);
...
}
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 : 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);
	}
...
}
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
 
public void accept(Visitor<InstanceNoeudItf> visitor) {
...
public void accept(Visitor<InstanceNoeud> visitor) {
...

Du coup, j'ai déclaré ceci, qui compile :
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);
	}
...
}
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
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.