Re: Generics
OK, making a fool of myself (or just showing what I fool I am):
my solution above is wrong - Oliver actually does the instanceof check
in EventManagerImpl.raiseEvent. I should have written:
===
public <T extends Event> Set<EventListener<? super T>> get(Class<?
extends T> eventClass) {
Set<EventListener<?>> listenersForType =
myListenersByType.get(eventClass);
Set<EventListener<? super T>> listeners = new HashSet<EventListener<?
super T>>();
listeners.addAll((Collection<? extends EventListener<? super T>>)
myListenersByType.get(eventClass));
return listeners;
}
===
However, this gives the warning:
Type safety: The cast from Set<EventListener<?>> to Collection<?
extends EventListener<? super T>> is actually checking against the
erased type Collection
Copying manually, casting individual elements solves that:
===
public <T extends Event> Set<EventListener<? super T>> get(Class<?
extends T> key) {
Set<EventListener<? super T>> listeners = new HashSet<EventListener<?
super T>>();
for (Entry<Class<? extends Event>, Set<EventListener<?>>> entry :
myListenersByType.entrySet()) {
listeners.add((EventListener<? super T>) entry.getValue());
}
return listeners;
}
===
Is there a nicer way?
Kofa