Мне нужно реализовать шаблон Observer со списком слушателей в классе событий.EventSource с картой <Класс <? extends Event>, List <EventListener <? extends Event >> without unchecked call
у меня есть:
пустой интерфейс Event
public interface Event {}
интерфейс для Слушателей:
public interface EventListener<T extends Event> {
void handle(T event);
Class<T> getEventClass();}
и события источник:
public class EventSource {
private final Map<Class<? extends Event>, List<EventListener<? extends Event>>> listeners = new HashMap<>();
public <T> void subscribe(EventListener<? extends Event> listener) {
Class<? extends Event> eventClass = listener.getEventClass();
if (!listeners.containsKey(eventClass)) {
listeners.put(eventClass, new ArrayList<>());
}
listeners.get(eventClass).add(listener);
}
public void unsubscribe(EventListener listener) {
listeners.remove(listener.getEventClass());
}
public void fire(Event event) {
for (EventListener listener : listeners.get(event.getClass())) {
listener.handle(event); //<-- Unchecked call to 'handle(T)' as a member of raw type...
}
}}
Он работает, но у меня есть " Непроверенный вызов " предупреждение. Как этого избежать?
Я пробовал:
public void fire(Event event) {
for (EventListener<? extends Event> listener : listeners.get(event.getClass())) {
listener.handle(event);//<-- compilation error
}
}
, но в этом случае у меня есть «ручка не может быть применен к ...» ошибка компиляции.
Заранее благодарен!
Использование NetBeans 7.4 Я не получаю свою ошибку, но я получаю: 'несовместимые типы: ArrayList
Спасибо за советы. Я понимаю проблему. В Map, List >> компилятор не знает, что "?" в классе и "?" в списке - один и тот же тип. И я не вижу способа передать это компилятору. –
Vitaly