Załóżmy Używam interfejsu z rodzajowego parametr typuUkrycie „lokalny” parametr typu w Javie
interface Foo<T> {
T getOne();
void useOne(T t);
}
Intencją jest, że typ jest abstrakcyjny T
: wymusza ograniczenie typu na implementacje Foo
, ale kod klienta nie obchodzi dokładnie, co to jest T
.
To nie jest problem w kontekście metody rodzajowe:
public <T> void doStuff(Foo<T> foo) {
T t = foo.getOne();
/* do stuff */
foo.useOne(t);
}
Ale załóżmy, chcę zerwać pracę doStuff
, oszczędzając trochę stan w klasie Bar
. W tym przypadku wydaje mi się, że muszę dodać parametr typu Foo
do Bar
.
public class Bar<T> {
private Foo<T> foo;
private T t;
/* ... */
public void startStuff() {
t = foo.getOne();
}
public void finishStuff() {
foo.useOne(t);
}
}
To jest trochę dziwne, ponieważ parametr typu T
nie pojawia się w interfejsie publicznym Bar
(to znaczy, nie jest wliczone w dowolnym parametrze metody lub rodzaj powrotu). Czy istnieje sposób na "oszacowanie odległości T
"? Czy mogę ustawić, aby parametr T
był ukryty w interfejsie Bar
, tak jak w poniższym?
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
...
}
Czy wiesz, jaki jest typ T, gdy piszesz pasek, czy jest on otwarty? – Eddie
Czy mógłbyś wyjaśnić, w jaki sposób Bar dostaje foo? Jeśli pobierze go jako parametr konstruktora, wówczas T pojawi się w jego interfejsie. Jeśli otrzymamy go z innego źródła, to T jest prawdopodobnie zdefiniowane tam, aw twoim przypadku jest coś konkretnego jak Foo. Jak to zrobić na swój sposób? –