我有一个看起来像这样的接口IEvent:
public abstract interface IEvent<T> {
public abstract void handleEvent(T payload);
}
和2具有如下所示的具体泛型类型的接口:
public interface IKeyDownEvent extends IEvent<KeyDownEventPayload> {}
public interface IKeyUpEvent extends IEvent<KeyUpEventPayload> {}
KeyUpEvent和KeyDownEvent都是从EventPayload扩展的。
如何对ArrayDeque进行迭代并迭代,只为实现IKeyDownEvent的类调用handleEvent(),而不是例如IKeyUpEvent?
我尝试了这个,但它似乎不起作用:
if (payload.getClass() == ev.getClass().getGenericSuperclass())
ev.handleEvent(payload);
答案 0 :(得分:1)
要真正回答您的问题,请使用Class.getGenericInterfaces
代替Class.getGenericSuperclass
,因为IEvent
是一个直接超级接口,而不是直接的超类。或者可以说更好,特别是现在我们没有接口interface
,使IEvent
成为一个抽象类。
仍然非常脆弱。例如,仅检查直接类型。另外检查运行时类型是个坏主意。
更好的是,不要将IEvent
直接放入Deque
。在正确处理IKeyDownEvent
的类中包装KeyDownEventPayload
,对其他类型也适用。