So ersetzen Sie die Laufzeitinstanz der Prüfung durch die Überprüfung der Generika zur Kompilierungszeit

Habe ein kleines Puzzle für einen echten Java Generics Spezialisten ...;)

Angenommen, ich habe die folgenden zwei Schnittstellen:

interface Processor {
    void process(Foo foo);
}

interface Foo {
    Processor getProcessor();
}

und zum Beispiel die folgenden zwei implementierenden Klassen:

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

Gibt es eine Möglichkeit, die beiden Schnittstellen so zu generieren, dass ich die markierten nicht benötige?instanceof einchecken in derprocess() funktionieren und noch das folgende Konstrukt an anderer Stelle in meinem Code arbeiten lassen?

foo.getProcessor().process(foo);

(Wo ich natürlich nicht weiß, mit welcher Unterklasse von Foo ich es zu tun habe)

Mit anderen Worten: Ich suche nach einer Möglichkeit, eine Funktion in einem Objekt so zu definieren, dass nur ein anderes Objekt zurückgegeben werden kann, das den Objekttyp verarbeitet, der die Funktion enthält. Hinweis: Ich spreche nicht nur von der Verarbeitung einer Superklasse mit dem kleinsten gemeinsamen Nenner des Objekts, das die Funktion enthält (oben: Foo), sondern von der eigentlichen Klasse des Objekts (oben: SomeFoo).

(Dies ist bei weitem nicht so trivial, wie es sich anhört, es sei denn, ich bin gerade wirklich dumm ...)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage