通用接口扩展Enums的通用

时间:2014-02-22 16:14:51

标签: java

我正在尝试编写一个通用的事件系统。为此,我想为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>  

//不通用那些测试枚举
那么我做错了什么?可以做我想做的事吗?

1 个答案:

答案 0 :(得分:0)

我会尽量保持简单。 IGameEvent<TYPE, ATT>,可以从TYPEATT中完全扣除。所以我只需删除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> {

}