用于Java中通用接口的typecheck

时间:2017-04-06 15:05:10

标签: java generics

我有一个看起来像这样的接口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);

1 个答案:

答案 0 :(得分:1)

要真正回答您的问题,请使用Class.getGenericInterfaces代替Class.getGenericSuperclass,因为IEvent是一个直接超级接口,而不是直接的超类。或者可以说更好,特别是现在我们没有接口interface,使IEvent成为一个抽象类。

仍然非常脆弱。例如,仅检查直接类型。另外检查运行时类型是个坏主意。

更好的是,不要将IEvent直接放入Deque。在正确处理IKeyDownEvent的类中包装KeyDownEventPayload,对其他类型也适用。