2017-04-06 71 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的類中,對其他類型也是如此。