我正在尝试编写一个通用的事件系统。为此,我想为EventHandler
创建一个像这样的接口(它不起作用):
public interface GameEventHandler<I extends GameEvent<TYPE extends Enum<?>, ATT extends Enum<?>>> {
public void handleEvent(final GameEvent<TYPE, ATT>... e);
public void registerListener(final GameEventListener<I> listener,
final TYPE... type);
public void unregisterListener(final GameEventListener<I>... listener);
public void unregisterAllListener();
public void unregisterAllListener(final I... type);
public void processEvents();
public void processEvents(final int maxTimeInMS);
}
但这不起作用,因为我认为它应该。
事件本身是一个非常简单的通用元素:
public class GameEvent<T extends Enum<?>, S extends Enum<?>> {
private HashMap<S, String> values;
private T type;
public void init(T type) {
this.type = type;
}
public T getType() {
return this.type;
}
public void addMessage(S t, String value) {
this.values.put(t, value);
}
public void getMessage(S t) {
this.values.get(t);
}
}
如果我实现HandlerInterface
我希望它仍然是通用的,那么有一些像DefaultHandler<GameEvent<TypeEnum, AttributEnum>>()
来创建它。因此,您可以使用界面创建自己的处理程序或使用我提供的DefaultHandler
,但仍然可以使用您自己的枚举。
目前我能够创建如下界面:
public interface GameEventHandler<I extends GameEvent<TYPE, ATT>, TYPE extends Enum<?>, ATT extends Enum<?>>
但我没有得到DefaultHandler Generic的实现
public class DefaultGameEventHandler implements GameEventHandler<GameEvent<EventTypes, AttributeTypes>, EventTypes, AttributeTypes>
//不通用那些测试枚举
那么我做错了什么?可以做我想做的事吗?
答案 0 :(得分:0)
我会尽量保持简单。 I
是GameEvent<TYPE, ATT>
,可以从TYPE
和ATT
中完全扣除。所以我只需删除I
并写下:
public interface GameEventHandler<TYPE extends Enum<?>, ATT extends Enum<?>> {
public void handleEvent(final GameEvent<TYPE, ATT>... e);
public void registerListener(final GameEventListener<TYPE, ATT> listener,
final TYPE... type);
public void unregisterListener(final GameEventListener<TYPE, ATT>... listener);
public void unregisterAllListener();
public void unregisterAllListener(final GameEvent<TYPE, ATT>... type);
public void processEvents();
public void processEvents(final int maxTimeInMS);
}
public class GameEventListener<TYPE extends Enum<?>, ATT extends Enum<?>> { }
public enum EventTypes {}
public enum AttributeTypes {}
public class DefaultGameEventHandler
implements GameEventHandler<EventTypes, AttributeTypes> {
}