이벤트 디스패처 인터페이스런타임시 제네릭 형식 매개 변수에 액세스 하시겠습니까?
public interface EventDispatcher {
<T> EventListener<T> addEventListener(EventListener<T> l);
<T> void removeEventListener(EventListener<T> l);
}
구현 (구현에) 내가 위의 코멘트와 함께 두 개의 오류를 표시 한
EventListener<ShapeAddEvent> l = addEventListener(new EventListener<ShapeAddEvent>() {
@Override
public void onEvent(ShapeAddEvent event) {
// TODO Auto-generated method stub
}
});
removeEventListener(l);
public class DefaultEventDispatcher implements EventDispatcher {
@SuppressWarnings("unchecked")
private Map<Class, Set<EventListener>> listeners = new HashMap<Class, Set<EventListener>>();
public void addSupportedEvent(Class eventType) {
listeners.put(eventType, new HashSet<EventListener>());
}
@Override
public <T> EventListener<T> addEventListener(EventListener<T> l) {
Set<EventListener> lsts = listeners.get(T); // ****** error: cannot resolve T
if (lsts == null) throw new RuntimeException("Unsupported event type");
if (!lsts.add(l)) throw new RuntimeException("Listener already added");
return l;
}
@Override
public <T> void removeEventListener(EventListener<T> l) {
Set<EventListener> lsts = listeners.get(T); // ************* same error
if (lsts == null) throw new RuntimeException("Unsupported event type");
if (!lsts.remove(l)) throw new RuntimeException("Listener is not here");
}
}
사용. 이 정보에 대한 런타임 액세스 권한을 얻는 방법이 있습니까?
너무 나쁜, 내 깔끔한 이벤트 모델을 간다 –
옵션은 여전히있어, (가 :) 추한 내가 유사한 장애물로 실행했습니다 –
이없는 당신은 적어도 새의 EventListener을 켤 수 있습니다 String.class)를 형식 유추를 사용하여 새 EventListener (String.class)에 추가하면 형식을 한 번만 선언하면됩니다. –