Cómo reemplazar la comprobación de la instancia en tiempo de ejecución con la validación de genéricos en tiempo de compilación

Tengo un pequeño rompecabezas para un verdadero especialista en Java Genéricos ...;)

Digamos que tengo las siguientes dos interfaces:

interface Processor {
    void process(Foo foo);
}

interface Foo {
    Processor getProcessor();
}

y, por ejemplo, las siguientes dos clases de implementación:

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

¿Hay alguna manera de hacer que las dos interfaces sean genéricas de tal manera que no necesite el marcado?instanceof comprobar en elprocess() ¿Funciona y aún tiene el siguiente trabajo de construcción en otro lugar en mi código?

foo.getProcessor().process(foo);

(donde, por supuesto, no sé con qué subclase de Foo estoy tratando)

En otras palabras: estoy buscando una manera de definir una función en un objeto de manera que solo pueda devolver otro objeto que procese el tipo de objeto que contenía la función. Nota: no estoy hablando solo de procesar una super-clase de denominador menos común del objeto que contiene la función (arriba: Foo), sino la clase real de ese objeto (arriba: SomeFoo).

(Esto no es tan trivial como puede sonar a menos que sea realmente estúpido en este momento ...)

Respuestas a la pregunta(6)

Su respuesta a la pregunta