Suppose I'm using an interface with a generic type parameter
interface Foo<T> {
T getOne();
void useOne(T t);
}
The intention is that the type T
is abstract: it enforces a type constraint on implementations of Foo
, but the client code doesn't care exactly what T
is.
This is no problem in the context of a generic method:
public <T> void doStuff(Foo<T> foo) {
T t = foo.getOne();
/* do stuff */
foo.useOne(t);
}
But suppose I want to break up the work of doStuff
, saving some state in a class Bar
. In this case, I seem to need to add the type parameter of Foo
to Bar
.
public class Bar<T> {
private Foo<T> foo;
private T t;
/* ... */
public void startStuff() {
t = foo.getOne();
}
public void finishStuff() {
foo.useOne(t);
}
}
This is kind of weird, since the type parameter T
does not appear in the public interface of Bar
(i.e., it is not included in any method parameter or return type). Is there a way to "quantify T
away"? I.e., can I arrange for the parameter T
to be hidden in the interface of Bar
, as in the following?
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
...
}