Могут ли дженерики и (супер?) Типовые токены помочь в создании безопасного для типов агрегатора новостей?
У меня есть это основноеNews
интерфейс
interface News {
String getHeader();
String getText();
}
и конкретные классы, такие какSportsNews
а такжеFinancialNews
предоставить конкретные методы, такие как,getStockPrice()
getSport()
и так далее. Новости предназначены для отправки на
interface Subscriber {
void onNews(N news);
}
Проблема в том, как зарегистрировать и поддерживать подписку. Первым подходом, который я попробовал, было использование центральногоAggregator
, сохраняя карту междуClass
объекты иSet
Но вскоре такой подход оказался нежизнеспособным. Вот желаемый API
public class Aggregator {
public void subscribe(Subscriber subscriber) {
// TODO somehow (super type token) extract N and
// add the item to the set retrieved by getSubscribersFor()
}
public void dispatch(N news) {
for (Subscriber subscriber: getSubscribersFor(news.getClass())) {
subscriber.onNews(news);
}
}
private Set getSubscribersFor(Class k) {
// TODO retrieve the Set for the specified key from the Map
}
}
Есть ли альтернатива безопасному типу? Может ли Java решить эту проблему вообще? я кладуэто небольшое демо онлайн чтобы помочь вам лучше понять, в чем проблема на самом деле.
ОБНОВИТЬ
Альтернативой было бы сделатьAggregator
сам параметризован с фактическим типом новостей. Это было бы хорошо, за исключением того, что этоПроблема курицы и яйца: теперь нужно найти способ получить агрегатор. На Яве естьнет возможности выразить следующее
interface News {
static Aggregator getAggregator();
}
static
метод можетт бытьabstract
там'нет никакого способа сослаться натекущий тип в аргументе типа