我有一個處理一個通用接口:如何避免使用原始類型並在類型未知時使用泛型?
public interface EventHandler<T> {
boolean handleEvent(T message);
}
您可以實現此界面和流程T message
。您必須將實施的實例傳遞給EventDispatcher
實例。該類在內部存儲多個各種類型的EventHandler
實例。
在某些點的事件被觸發並且EventDispatcher
實例調用相應EventHandler
的handleEvent()
方法和傳遞的消息是相同的類型EventHandler
。問題是我不知道哪一個是確切類型,但我確信我傳遞給EventHandler
實例的T message
具有相同的「T」。
我做這個調用使用原始類型和工作方式:
EventHandler handler = getHandler();
Object message = getMessage();
handler.handleEvent(message);
,但我得到警告「以‘爲handleEvent(T)’爲原料型‘事件處理程序’的成員未選中呼叫」。
是否可以使用泛型來避免警告?
我已經想到了一種可能的解決方案是一個通用的包裝方法:
private <T> boolean handleEventGeneric(EventHandler<T> handler, T message) {
return handler.handleEvent(message);
}
,並使用它:
EventHandler handler = getHandler();
Object message = getMessage();
handleEventGeneric(action.eventHandler, message);
但我不喜歡的事實,我必須做出一個包裝方法。有沒有更優雅的解決方案?
這第二代碼片段仍然使用原始類型:
見說明我的觀點的一些演示代碼。 –
但這聽起來像是一個無法解決的問題;您正嘗試使用基於僅在運行時可用的信息的編譯時類型安全性。 –
最後一個代碼示例不使用'handler'變量。有錯誤嗎?另請提供'getHandler()'和'getMessage()'方法的簽名。 –