Могут ли дженерики и (супер?) Типовые токены помочь в создании безопасного для типов агрегатора новостей?
У меня есть это основное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
нет никакого способа сослаться натекущий тип в аргументе типа