Können Generika und (Super-?) Typentoken beim Aufbau eines typsicheren Nachrichtenaggregators helfen?

Ich habe diese grundlegendeNews Schnittstelle

interface News {
    String getHeader();
    String getText();
}

und konkrete Klassen mögenSportsNews undFinancialNews spezifische Methoden wiegetStockPrice(), getSport() und so weiter. Nachrichten sollen an a. Versandt werden

interface Subscriber<N extends News> {
    void onNews(N news);
}

Das Problem ist, wie man Abonnements registriert und verwaltet. Der erste Ansatz, den ich versuchte, war die Verwendung einer ZentraleAggregator, eine Karte zwischenClass<T> Objekte undSet<Subscriber<T>>, aber bald zeigte sich dieser Ansatz unrentabel. Hier ist die gewünschte API

public class Aggregator {

    public <N extends News> void subscribe(Subscriber<N> subscriber) {
        // TODO somehow (super type token) extract N and 
        // add the item to the set retrieved by getSubscribersFor()
    }

    public <N extends News> void dispatch(N news) {
        for (Subscriber<N> subscriber: getSubscribersFor(news.getClass())) {
            subscriber.onNews(news);
        }
    }

    private <N extends News> Set<Subscriber<N>> getSubscribersFor(Class<N> k) {
        // TODO retrieve the Set for the specified key from the Map
    }
}

Gibt es eine Alternative, um typsicher zu sein? Kann Java dieses Problem überhaupt lösen? ich setzediese kleine Demo online um Ihnen zu helfen, das Problem besser zu verstehen.

AKTUALISIEREN

Eine Alternative wäre zu machenAggregator selbst mit dem aktuellen Nachrichtentyp parametriert. Dies wäre in Ordnung, mit der Ausnahme, dass es sich um ein Henne-Ei-Problem handelt: Jetzt muss man einen Weg finden, um den Aggregator abzurufen. In Java gibt es keine Möglichkeit, Folgendes auszudrücken

interface News {
    static Aggregator<CurrentClass> getAggregator();
}
static Methode kann nicht seinabstractEs gibt keine Möglichkeit, auf das zu verweisenaktueller Typ in einem Typargument

Antworten auf die Frage(4)

Ihre Antwort auf die Frage