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 ...)

questionAnswers(6)

yourAnswerToTheQuestion