2014-02-22 107 views
1

我想寫一個通用的事件系統。爲此,我想創建爲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的通用

public class DefaultGameEventHandler implements GameEventHandler<GameEvent<EventTypes,  AttributeTypes>, EventTypes, AttributeTypes> 

//不是通用的執行情況是測試枚舉
那麼我做錯了什麼?有可能做我想做的事嗎?

回答

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> { 

}