Why do you declare mListeners equal to ~ ? extends E ? extends E , not just E ?
If you use
private CopyOnWriteArrayList<EventHandler<E>> mListeners = new CopyOnWriteArrayList<EventHandler<E>>();
It will work.
Or take PECS (producer producer, consumer super). As others suggested
private CopyOnWriteArrayList<EventHandler<? super E>> mListeners = new CopyOnWriteArrayList<EventHandler<? super E>>();
with corresponding changes to the for loop.
Edit: a more complete example. This does not show any warnings or errors, and, based on what you gave, will work.
public static class Sandbox { public static interface EventArgs {} public static abstract class EventHandler<E extends EventArgs> { public abstract void HandleEvent(Object sender, E e); } public static class Observers<E extends EventArgs> { private CopyOnWriteArrayList<EventHandler<? super E>> mListeners = new CopyOnWriteArrayList<EventHandler<? super E>>(); public void dispatchEvent(Object sender, E args) { if (mListeners != null) { for (EventHandler<? super E> listener : mListeners) { listener.HandleEvent(sender, args); } } } public void addListener(EventHandler<? super E> listener) { mListeners.add(listener); } } }
source share