Могут ли дженерики и (супер?) Типовые токены помочь в создании безопасного для типов агрегатора новостей?

У меня есть это основноеNews интерфейс

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

и конкретные классы, такие какSportsNews а такжеFinancialNews предоставить конкретные методы, такие какgetStockPrice(), getSport() и так далее. Новости предназначены для отправки на

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

Проблема в том, как зарегистрировать и поддерживать подписку. Первым подходом, который я попробовал, было использование центральногоAggregator, сохраняя карту междуClass<T> объекты иSet<Subscriber<T>>Но вскоре такой подход оказался нежизнеспособным. Вот желаемый 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
    }
}

Есть ли альтернатива безопасному типу? Может ли Java решить эту проблему вообще? я кладуэто небольшое демо онлайн чтобы помочь вам лучше понять, в чем проблема на самом деле.

ОБНОВИТЬ

Альтернативой было бы сделатьAggregator сам параметризован с фактическим типом новостей. Это было бы хорошо, за исключением того, что это проблема курицы и яйца: теперь нужно найти способ получить агрегатор. В Java нет возможности выразить следующее

interface News {
    static Aggregator<CurrentClass> getAggregator();
}
static метод не может бытьabstractнет никакого способа сослаться натекущий тип в аргументе типа

Ответы на вопрос(4)

Ваш ответ на вопрос