Предположим, я использую интерфейс с параметром универсального типа
interface Foo<T> {
T getOne();
void useOne(T t);
}
Предполагается, что тип T
является абстрактным: он применяет ограничение типа для реализаций Foo
, но клиентскому коду абсолютно все равно, что такое T
.
Это не проблема в контексте универсального метода:
public <T> void doStuff(Foo<T> foo) {
T t = foo.getOne();
/* do stuff */
foo.useOne(t);
}
Но предположим, что я хочу разбить работу doStuff
, сохранив некоторое состояние в классе Bar
. В этом случае мне кажется, что мне нужно добавить параметр типа 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);
}
}
Это немного странно, поскольку параметр типа T
не отображается в общедоступном интерфейсе Bar
(т.е. он не включен ни в один из параметров метода или возвращаемого типа). Есть ли способ «количественно оценить» T
? Т.е. можно ли сделать так, чтобы параметр T
был скрыт в интерфейсе Bar
, как показано ниже?
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
...
}