我需要实现观察者模式与每个事件类的监听器列表。带有Map <Class <?的EventSource?扩展Event>,List <EventListener <?扩展事件>>没有未经检查的呼叫
我:
空接口事件
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