Como substituir a instância de tempo de execução da verificação com validação de genéricos em tempo de compilação

Tenho um pequeno quebra-cabeça para um verdadeiro especialista em Java Generics ...;)

Digamos que eu tenha as duas interfaces a seguir:

interface Processor {
    void process(Foo foo);
}

interface Foo {
    Processor getProcessor();
}

e, por exemplo, as duas seguintes classes de implementação:

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;
    }
}

Existe alguma maneira de tornar as duas interfaces genéricas de tal forma que eu não precise doinstanceof verifique noprocess() função e ainda tem a seguinte construção funcionar em outro lugar no meu código?

foo.getProcessor().process(foo);

(onde, claro, eu não sei com que subclasse de Foo estou lidando)

Em outras palavras: estou procurando uma maneira de definir uma função em um objeto, de modo que ela só possa retornar outro objeto que processe o tipo de objeto que continha a função. Nota: Não estou falando apenas do processamento de uma superclasse de pelo menos um denominador comum do objeto que contém a função (acima de: Foo), mas da classe real desse objeto (acima: SomeFoo).

(Isso não é nem de longe tão trivial quanto possa parecer, a menos que eu esteja realmente sendo idiota agora ...)

questionAnswers(6)

yourAnswerToTheQuestion