Jak zastąpić sprawdzanie instancji w czasie wykonywania za pomocą walidacji generycznej w czasie kompilacji
Masz małą łamigłówkę dla prawdziwego specjalisty Java Generics ...;)
Powiedzmy, że mam dwa następujące interfejsy:
interface Processor {
void process(Foo foo);
}
interface Foo {
Processor getProcessor();
}
i na przykład następujące dwie klasy implementacyjne:
static class SomeProcessor implements Processor {
static final SomeProcessor INSTANCE = new SomeProcessor();
@Override
public void process(Foo foo) {
if (foo instanceof SomeFoo) { // <-- GET RID OF THIS ?
// process ((SomeFoo) foo)
}
}
}
class SomeFoo implements Foo {
@Override
public Processor getProcessor() {
return SomeProcessor.INSTANCE;
}
}
Czy jest jakiś sposób, aby oba interfejsy były generyczne w taki sposób, że nie potrzebuję oznaczonychinstanceof
sprawdź wprocess()
działa i nadal działa następująca konstrukcja w innym miejscu mojego kodu?
foo.getProcessor().process(foo);
(gdzie oczywiście nie wiem, z którą podklasą Foo mam do czynienia)
Innymi słowy: szukam sposobu na zdefiniowanie funkcji w obiekcie, tak aby mógł on zwracać tylko inny obiekt, który przetwarza typ obiektu, który zawierał tę funkcję. Uwaga: Nie mówię tylko o przetwarzaniu jakiejś najmniejszej wspólnej klasy super-klasy obiektu zawierającego funkcję (powyżej: Foo), ale o rzeczywistej klasie tego obiektu (powyżej: SomeFoo).
(Nigdzie nie jest to tak trywialne, jak mogłoby się wydawać, chyba że teraz jestem naprawdę głupi ...)