Supposons que j'utilise une interface avec un paramètre de type génériqueHiding un paramètre de type « local » en Java
interface Foo<T> {
T getOne();
void useOne(T t);
}
L'intention est que le type T
est abstraite: il applique une contrainte de type sur les implémentations de Foo
, mais le code client ne se soucie pas exactement de ce qu'est T
.
Aucun problème dans le contexte d'une méthode générique:
public <T> void doStuff(Foo<T> foo) {
T t = foo.getOne();
/* do stuff */
foo.useOne(t);
}
Mais suppose que je veux rompre le travail de doStuff
, sauver un état dans une classe Bar
. Dans ce cas, il me semble avoir besoin d'ajouter le paramètre de type Foo
à Bar
.
public class Bar<T> {
private Foo<T> foo;
private T t;
/* ... */
public void startStuff() {
t = foo.getOne();
}
public void finishStuff() {
foo.useOne(t);
}
}
C'est un peu bizarre, car le paramètre de type T
ne figure pas dans l'interface publique de Bar
(à savoir, il ne figure pas dans tous les paramètres de la méthode ou le type de retour). Existe-t-il un moyen de "quantifier T
"? Par exemple, puis-je faire en sorte que le paramètre T
soit masqué dans l'interface de Bar
, comme suit?
public class Bar {
<T> { // foo and t have to use the same T
private Foo<T> foo;
private T t;
} // T is out of scope
...
}
Savez-vous ce que le type T est, lorsque vous écrivez Bar, ou est-il ouvert? – Eddie
Pourriez-vous clarifier, comment Bar obtient foo? S'il l'obtient en tant que paramètre constructeur, alors T apparaît dans son interface. S'il l'obtient à partir d'une autre source, alors T est probablement défini là et dans votre cas c'est quelque chose de concret comme Foo. Comment cela se fait-il à votre façon? –