Gast
2009-12-08, 06:06:08
Hi,
habe da mal ein Problem mit den Generics in Java, geht um einen EventBus. Zwei Klassen:
public class EventBus {
private static HashMap<Class<?>, ArrayList<EventSubscriber<?>>> subscriber = new HashMap<Class<?>, ArrayList<EventSubscriber<?>>>();
public static <T> void subscribe(Class<T> class1, EventSubscriber<T> eventSubscriber) {
ArrayList<EventSubscriber<?>> subs;
if (subscriber.containsKey(class1)) {
// alte liste holen und den subscriber hinzufügen
subs = subscriber.get(class1);
subs.add(eventSubscriber);
} else {
// neue arraylist und in die hashmap schreiben
subs = new ArrayList<EventSubscriber<?>>();
subs.add(eventSubscriber);
subscriber.put(class1, subs);
}
}
public static void publish(Object t) {
// falls keine subscriber vorhanden sind, dann abbrechen
if(!subscriber.containsKey(t.getClass()))
return;
ArrayList<EventSubscriber<?>> subs = subscriber.get(t.getClass());
for(EventSubscriber<?> sub : subs){
sub.onEvent(t);
}
}
}
public interface EventSubscriber<E> {
void onEvent(Object t);
}
So siehts momentan aus, und es funktioniert. Allerdings muss ich jedesmal in der onEvent()-Methode ein Cast zum richtigen Object machen welches ich verhindern will.
So benutze ich es jetzt:
EventBus.subscribe(String.class, new EventSubscriber<String>() {
@Override
public void onEvent(Object t) {
String z = (String) t;
Window.alert(z);
}
});
Und so soll es eigentlich sein:
EventBus.subscribe(String.class, new EventSubscriber<String>() {
@Override
public void onEvent(String t) {
Window.alert(t);
}
});
Ich bin mir recht sicher das das Interface hierfür wie folgt sein muss(habe es nur geaendert damit es übehaupt erstmal funktioniert):
public interface EventSubscriber<E> {
void onEvent(E t);
}
Allerdings bekomme ich dann Compile-Errors in der publish()-Methode da der Compiler durch die Wildcards den Typ nicht eindeutig bestimmen kann ... Für eine Lösung wäre ich dankbar, hab nämlich grade keine Ahnung wie ichs hinbekommen könnte :/
habe da mal ein Problem mit den Generics in Java, geht um einen EventBus. Zwei Klassen:
public class EventBus {
private static HashMap<Class<?>, ArrayList<EventSubscriber<?>>> subscriber = new HashMap<Class<?>, ArrayList<EventSubscriber<?>>>();
public static <T> void subscribe(Class<T> class1, EventSubscriber<T> eventSubscriber) {
ArrayList<EventSubscriber<?>> subs;
if (subscriber.containsKey(class1)) {
// alte liste holen und den subscriber hinzufügen
subs = subscriber.get(class1);
subs.add(eventSubscriber);
} else {
// neue arraylist und in die hashmap schreiben
subs = new ArrayList<EventSubscriber<?>>();
subs.add(eventSubscriber);
subscriber.put(class1, subs);
}
}
public static void publish(Object t) {
// falls keine subscriber vorhanden sind, dann abbrechen
if(!subscriber.containsKey(t.getClass()))
return;
ArrayList<EventSubscriber<?>> subs = subscriber.get(t.getClass());
for(EventSubscriber<?> sub : subs){
sub.onEvent(t);
}
}
}
public interface EventSubscriber<E> {
void onEvent(Object t);
}
So siehts momentan aus, und es funktioniert. Allerdings muss ich jedesmal in der onEvent()-Methode ein Cast zum richtigen Object machen welches ich verhindern will.
So benutze ich es jetzt:
EventBus.subscribe(String.class, new EventSubscriber<String>() {
@Override
public void onEvent(Object t) {
String z = (String) t;
Window.alert(z);
}
});
Und so soll es eigentlich sein:
EventBus.subscribe(String.class, new EventSubscriber<String>() {
@Override
public void onEvent(String t) {
Window.alert(t);
}
});
Ich bin mir recht sicher das das Interface hierfür wie folgt sein muss(habe es nur geaendert damit es übehaupt erstmal funktioniert):
public interface EventSubscriber<E> {
void onEvent(E t);
}
Allerdings bekomme ich dann Compile-Errors in der publish()-Methode da der Compiler durch die Wildcards den Typ nicht eindeutig bestimmen kann ... Für eine Lösung wäre ich dankbar, hab nämlich grade keine Ahnung wie ichs hinbekommen könnte :/