Les classes que je traite sont les suivants,erreur capture Wildcard
public interface One{
public Two get();
}
public class Foo{...}
public class Bar extends Foo{...}
public abstract class Parent<T extends Foo> implements One {...}
public abstract class Child<T extends Foo> extends Parent<T>
J'ai une méthode statique qui retourne un objet enfant donné un objet Foo,
public static Child<? extends Foo> get(Foo f){...}
Cette méthode renvoie un enfant construit à partir d'un objet Foo ou Bar. Le code qui jette l'erreur est-ce,
Foo f = new Foo();
Child<? extends Foo> child = O.get(f);
Two t = S.apply(child);
La méthode apply,
public Two apply(One o){...};
L'erreur qui est jeté est,
apply(One) in S cannot be applied to (Child<capture#123 of ?>)
Ma solution actuelle à ce problème est de changer le code à ceci,
Foo f = new Foo();
Child<? extends Foo> child = O.get(f);
Object o = child;
One one = (One)o;
Two t = S.apply(one);
Cela résout l'erreur, je ne sais pas pourquoi le casting explicite à l'objet doit être là, mais il est là.
Quelqu'un peut-il me dire s'il est possible de modifier le code afin que les conversions ne soient pas nécessaires pour que cela fonctionne?
Le code que vous avez donné fonctionne pour moi sans la solution de contournement donnée lors de la compilation à la fois pour 1.5 et 1.6. C'est presque comme si Child ne savait pas que Parent implémente One. – ILMTitan
Ouais, je voudrais nettoyer et reconstruire. Ou si vous ne nous donnez pas un exemple qui présente le problème, donnez-nous un exemple qui montre le problème. –
C'est la compilation nocturne qui lance l'erreur, donc je ne suis pas tout à fait sûr quels sont les paramètres du compilateur exact. J'essaie de trouver un moyen de mieux le reproduire maintenant. – Andrew