¿Pueden los genéricos y los (súper?) Tokens de tipo ayudar a construir un agregador de noticias de tipo seguro?
Tengo este básicoNews
interfaz
interface News {
String getHeader();
String getText();
}
y clases concretas comoSportsNews
yFinancialNews
para proporcionar métodos específicos comogetStockPrice()
, getSport()
y así. Las noticias están destinadas a ser enviadas a
interface Subscriber<N extends News> {
void onNews(N news);
}
El problema es cómo registrar y mantener suscripciones. El primer enfoque que probé fue usar una centralAggregator
, manteniendo un mapa entreClass<T>
objetos ySet<Subscriber<T>>
, pero pronto este enfoque reveló inviable. Aquí está la API deseada
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
}
}
¿Hay alguna alternativa para ser de tipo seguro? ¿Puede Java resolver este problema en absoluto? pongoesta pequeña demostración en línea para ayudarte a entender mejor cuál es realmente el problema.
ACTUALIZAR
Una alternativa sería hacerAggregator
sí parametrizado con el tipo de noticias real. Esto estaría bien, excepto que es un problema del huevo y la gallina: ahora se necesita encontrar una manera de recuperar el agregador. En Java no hay forma de expresar lo siguiente
interface News {
static Aggregator<CurrentClass> getAggregator();
}
static
el método no puede serabstract
no hay manera de hacer referencia a latipo actual en un argumento de tipo