Je reviens avec mes generics
Cette fois-ci, je tente de faire un patron strategy
Pour être plus clair, un genre de truc comme ça
(décrit là)
Voilà ma classe abtraite Context qui possède une méthode qui fait appel à une stratégie qui peut changer dynamiquement :
Code :
- public abstract class Context <N extends Number> {
- private Strategy < N , ? super Context<N> > strategy;
- public void setStrategy(Strategy < N , ? super Context<N> > strategy) {
- this.strategy = strategy;
- }
- // méthode qui utilise la stratégie
- public N call() throws Exception {
- return this.strategy.call(this);
- }
- }
|
Et l'interface qui spécifie la stratégie :
Code :
- public interface Strategy < N extends Number , C extends Context<N> > {
- public abstract N call(C context);
- }
|
Mon problème est au moment du sous-typage. Voici comment je voudrai déclarer mon sous-type de Context :
Code :
- public class SomeObject extends Context<Integer> {
- public void changeStrategy(SomeStrategy strategy) {
- // ERREUR
- this.setStrategy(strategy);
- }
- }
|
et ma stratégie :
Code :
- public class SomeStrategy implements Strategy<Integer,SomeObject> {
- public Integer call(SomeObject context) {
- return 0;
- }
- }
|
Mais j'ai une erreur sur "this.setStrategy(strategy);", le compilo me sort :
The method setStrategy(Strategy<Integer,? super Context<Integer>> ) in the type Context<Integer> is not applicable for the arguments (SomeStrategy)
|
J'ai du mal à comprendre l'erreur
toujours est-il qu'avec une stratégie implémentée comme ça, tout passe :
Code :
- public class SomeStrategy implements Strategy<Integer,Context<Integer>> {
- public Integer call(Context<Integer> context) {
- return 0;
- }
- }
|
Mais du coup, je suis obligé de recaster mon objet Context en SomeObject
Quelqu'un(e) a une idée ? 