我正在制作自己的事件系统并尝试使其像这样可用。
EventSystem.get(EventClientStart.class)
.setCallback((event) -> {
System.out.println("Client Started");
});
EventSystem.get(EventClientStart.class)
.invoke(new EventClientStart());
但是类型检查有问题,我错过了什么? T 是由 Event 扩展的,我认为它应该有效并且实际上是(只有当我将其强制转换为 (EventController) 时,但随后我会收到警告“Unchecked Cast”)
EventSystem.java
package im.silkproject.event;
import im.silkproject.event.internal.EventController;
import java.util.HashMap;
import java.util.Map;
public final class EventSystem
{
private static final Map<Class<? extends Event>, EventController<? extends Event>> map = new HashMap<>();
private EventSystem() { }
public static <T extends Event> EventController<T> get(Class<T> event)
{
return map.computeIfAbsent(event, k -> new EventController<>());
}
}
事件.java
package im.silkproject.event;
public class Event
{
private boolean cancelled;
public void cancel()
{
cancelled = true;
}
public boolean isCancelled()
{
return cancelled;
}
}
EventCallback.java
package im.silkproject.event.internal;
@FunctionalInterface
public interface EventCallback<T>
{
void __call(T event);
}
EventController.java
package im.silkproject.event.internal;
import java.util.concurrent.CopyOnWriteArrayList;
public class EventController<T>
{
private final CopyOnWriteArrayList<EventCallback<T>> callbacks = new CopyOnWriteArrayList<>();
public void invoke(T event)
{
for (EventCallback<T> callback : callbacks)
{
callback.__call(event);
}
}
public int length()
{
return callbacks.size();
}
public boolean setCallback(EventCallback<T> event)
{
return callbacks.addIfAbsent(event);
}
public boolean unsetCallback(EventCallback<T> event)
{
return callbacks.remove(event);
}
}