Os genéricos e os tokens do tipo (super?) Ajudam a criar um agregador de notícias seguro de tipos?
Eu tenho esse básicoNews
interface
interface News {
String getHeader();
String getText();
}
e aulas concretas comoSportsNews
eFinancialNews
para fornecer métodos específicos comogetStockPrice()
, getSport()
e assim por diante. As notícias destinam-se a ser enviadas para um
interface Subscriber<N extends News> {
void onNews(N news);
}
O problema é como registrar e manter assinaturas. A primeira abordagem que tentei foi usar uma centralAggregator
, mantendo um mapa entreClass<T>
objetos eSet<Subscriber<T>>
, mas logo esta abordagem revelou inviável. Aqui está a API desejada
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
}
}
Existe alguma alternativa para ser seguro? O Java pode resolver esse problema? Eu colocoesta pequena demonstração online para ajudá-lo a entender melhor qual é o problema.
ATUALIZAR
Uma alternativa seria fazerAggregator
se parametrizado com o tipo de notícia real. Isso seria ok, exceto que é um problema de galinha e ovo: agora é preciso encontrar uma maneira de recuperar o agregador. Em Java não há como expressar o seguinte
interface News {
static Aggregator<CurrentClass> getAggregator();
}
static
método não pode serabstract
não há como referenciartipo atual em um argumento de tipo