我正在為我的 Java 應用程式撰寫一個事件系統,但我一直對泛型感到困惑。
假設這是EventManager.java:
public class EventManager {
private final Map<Class<? extends Event>, List<EventHandler<?>>> eventHandlerMap = new HashMap<>();
public synchronized <T extends Event> void fire(T event) {
Class<? extends Event> eventClass = event.getClass();
if (!eventHandlerMap.containsKey(eventClass)) return;
List<EventHandler<? extends Event>> handlerList =
eventHandlerMap.get(eventClass);
for (EventHandler<? extends Event> eventHandler : handlerList) {
eventHandler.handleEvent(event.getClass().cast(event));
}
}
}
Event.java:
public abstract class Event {
}
和EventHandler.java:
public abstract class EventHandler<T extends Event> {
public abstract void handleEvent(T event);
}
IntelliJ IDEA 向我報告以下錯誤:
作為臨時緩解措施,我在EventHandler類中添加了以下方法:
@SuppressWarnings("unchecked")
public final void handleEvent0(Event event) {
handleEvent((T) event);
}
...并更改了fire方法EventManager:
public synchronized void fire(Event event) {
Class<? extends Event> eventClass = event.getClass();
if (!eventHandlerMap.containsKey(eventClass)) return;
List<EventHandler<? extends Event>> handlerList =
eventHandlerMap.get(eventClass);
for (EventHandler<? extends Event> eventHandler : handlerList) {
eventHandler.handleEvent0(event);
}
}
這確實有效,但是我想知道我最初做錯了什么以及如何正確修復它。請幫助并為我的英語感到抱歉!
uj5u.com熱心網友回復:
編譯器無法確保它們屬于同一型別eventHandler,因此它會給出錯誤。event.getClass()T
如果您可以確保eventHandlerMap鍵和值型別匹配,您可以強制eventHandler轉換為EventHandler<T>.
for (EventHandler<? extends Event> eventHandler : handlerList) {
@SuppressWarnings("unchecked")
EventHandler<T> handler = (EventHandler<T>) eventHandler;
handler.handleEvent(event);
}
使用原始型別的舊方法:請勿使用(參見 Joachim Sauer 的評論):
您可以洗掉<? extends Event>回圈變數中的通用定義eventHandler以擺脫handleEvent0. 那么就不需要投射事件了。
for (EventHandler eventHandler : handlerList) {
eventHandler.handleEvent(event);
}
但這會給你一些編譯器警告。
通過此編輯,您還可以洗掉以下通用型別fire:
public synchronized void fire(Event event)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/526415.html
標籤:爪哇仿制药
