2017-04-06 74 views
-1

通用接口我有一个接口IEvent,看起来像这样:类型检测,在Java

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

_“具体接口”_ - 对不起,没有这样的事情。接口不能是“具体的”。你考虑过'instanceof'吗? –

+0

@JimGarrison看起来很明显,OP指的是非抽象接口。 – nicomp

+0

_“非抽象接口”_ - 也没有这样的事情。你的意思是“非通用”吗? –

回答

1

要字面上回答你的问题,使用Class.getGenericInterfaces代替Class.getGenericSuperclassIEvent是立即超级接口,而不是一个直接超类。或者可以说特别好,现在我们没有接口interface,使得IEvent是一个抽象类。

还是那么脆弱。例如,只检查直接类型。同时检查运行时类型是一个坏主意。

更好的是,不要把IEvent直接输入到Deque。将IKeyDownEvent包装在正确处理KeyDownEventPayload的类中,对其他类型也是如此。