Je pensais avoir bien compris les génériques, mais apparemment je ne l'ai pas fait.Apprivoiser le vérificateur de type dans Java Generics
Voici le cas de test du problème:
import java.util.ArrayList;
class Job<J extends Job<J,R>, R extends Run<J,R>> {}
class Run<J extends Job<J,R>, R extends Run<J,R>> {}
class Job2 extends Job<Job2,Run2> {}
class Run2 extends Run<Job2,Run2> {}
class RunList<J extends Job<J,R>, R extends Run<J,R>> extends ArrayList<R> {}
class Foo {
// #1 problem
public void test1(RunList<Job,Run> why) {}
// #2 this doesn't work either
public void test2(RunList<Job<Job,Run>,Run<Job,Run>> why) {}
// #3 this works
public void test3(RunList<Job2,Run2> why) {}
}
Le compilateur ne permet pas la méthode de test1 ci-dessus, en disant que « Job » est pas dans ses limites de type. Je comprends un peu --- --- Job
comme un type brut ne s'étend pas Job<Job,Run>
, d'où l'erreur. En revanche, test3 fonctionne. Maintenant, la question est, comment puis-je faire ce travail? J'ai essayé # 2, mais cela ne fonctionne pas non plus. Le problème que je suppose est vraiment similaire aveC# 1 --- Job<Job,Run>
n'est pas dans les limites parce que son argument de type Job
est un type brut.
Est-ce que quelqu'un sait comment rendre le vérificateur de type heureux, autre que le recours au type brut? Ou est-ce simplement inaccessible dans le système de type Java?
Pouvez-vous fournir toute information supplémentaire sur ce que vous voulez travailler? On dirait que vous avez une solution - laquelle est celle que vous voulez travailler, et pourquoi? – mlschechter
Notez que # 3 est sémantiquement différent, et ce n'est pas une solution --- ce n'est même pas une solution de contournement. # 3 vous donne effectivement ArrayList, et ainsi, par exemple, vous ne pouvez pas ajouter l'objet Exécuter brut là-dedans. Je veux RunList avec des Jobs et Runs, de sorte que par exemple je puisse y mettre un objet Run. # 2, si travaillé, permettrait d'atteindre quelque chose de similaire. –