Supponiamo che io sto usando un'interfaccia con un parametro di tipo genericoNascondere un parametro di tipo "locale" in Java
interface Foo<T> {
T getOne();
void useOne(T t);
}
L'intenzione è che il tipo T
è astratto: si applica un vincolo di tipo sulle implementazioni di Foo
, ma il codice cliente non interessa esattamente cosa sia T
.
Questo non è un problema nel contesto di un metodo generico:
public <T> void doStuff(Foo<T> foo) {
T t = foo.getOne();
/* do stuff */
foo.useOne(t);
}
Ma supponiamo che io voglio rompere il lavoro di doStuff
, risparmiando qualche stato in una classe Bar
. In questo caso, sembra necessario aggiungere il parametro type di Foo
a Bar
.
public class Bar<T> {
private Foo<T> foo;
private T t;
/* ... */
public void startStuff() {
t = foo.getOne();
}
public void finishStuff() {
foo.useOne(t);
}
}
Questo è un po 'strano, dal momento che il parametro di tipo T
non viene visualizzato nell'interfaccia pubblica del Bar
(vale a dire, non è incluso in qualsiasi parametro di metodo o tipo di ritorno). C'è un modo per "quantificare T
di distanza"? Posso installare il parametro T
nell'interfaccia di Bar
, come di seguito?
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
...
}
Sai qual è il tipo T, quando scrivi Bar o è a tempo indeterminato? – Eddie
Potrebbe chiarire, come Bar si piega? Se lo ottiene come parametro costruttore, allora T appare nella sua interfaccia. Se lo ottiene da qualche altra fonte, allora T è probabilmente definito lì e nel tuo caso è qualcosa di concreto come Foo. Come è fatto a modo tuo? –