Können Generika und (Super-?) Typentoken beim Aufbau eines typsicheren Nachrichtenaggregators helfen?
Ich habe diese grundlegendeNews
Schnittstelle
interface News {
String getHeader();
String getText();
}
und konkrete Klassen mögenSportsNews
undFinancialNews
spezifische Methoden wiegetStockPrice()
, getSport()
und so weiter. Nachrichten sollen an a. Versandt werden
interface Subscriber<N extends News> {
void onNews(N news);
}
Das Problem ist, wie man Abonnements registriert und verwaltet. Der erste Ansatz, den ich versuchte, war die Verwendung einer ZentraleAggregator
, eine Karte zwischenClass<T>
Objekte undSet<Subscriber<T>>
, aber bald zeigte sich dieser Ansatz unrentabel. Hier ist die gewünschte 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
}
}
Gibt es eine Alternative, um typsicher zu sein? Kann Java dieses Problem überhaupt lösen? ich setzediese kleine Demo online um Ihnen zu helfen, das Problem besser zu verstehen.
AKTUALISIEREN
Eine Alternative wäre zu machenAggregator
selbst mit dem aktuellen Nachrichtentyp parametriert. Dies wäre in Ordnung, mit der Ausnahme, dass es sich um ein Henne-Ei-Problem handelt: Jetzt muss man einen Weg finden, um den Aggregator abzurufen. In Java gibt es keine Möglichkeit, Folgendes auszudrücken
interface News {
static Aggregator<CurrentClass> getAggregator();
}
static
Methode kann nicht seinabstract
Es gibt keine Möglichkeit, auf das zu verweisenaktueller Typ in einem Typargument