Supongamos que estoy usando una interfaz con un parámetro de tipo genéricoOcultación de un parámetro de tipo "local" en Java
interface Foo<T> {
T getOne();
void useOne(T t);
}
La intención es que el tipo T
es abstracto: se impone una restricción sobre el tipo de implementaciones Foo
, pero al código del cliente no le importa exactamente qué es T
.
esto no es problema en el contexto de un método genérico:
public <T> void doStuff(Foo<T> foo) {
T t = foo.getOne();
/* do stuff */
foo.useOne(t);
}
Pero supongamos que quiero romper el trabajo de doStuff
, ahorrando algún estado en una clase Bar
. En este caso, parece que necesito agregar el parámetro de tipo de 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);
}
}
Esto es un poco extraño, ya que el parámetro de tipo T
no aparece en la interfaz pública de Bar
(es decir, no está incluido en ningún parámetro del método o el tipo de retorno). ¿Hay alguna forma de "cuantificar T
de distancia"? Es decir, ¿puedo organizar que el parámetro T
esté oculto en la interfaz de Bar
, como se muestra a continuación?
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
...
}
¿Sabes lo que es el tipo T, al escribir Bar, o es abierto? – Eddie
¿Podría aclarar, cómo consigue Bar foo? Si lo obtiene como parámetro de constructor, entonces T aparece en su interfaz. Si lo obtiene de alguna otra fuente, entonces T probablemente se define allí y en su caso es algo concreto como Foo. ¿Cómo se hace en tu camino? –