2014-02-22 1 views
1

일반 이벤트 시스템을 작성하려고합니다.일반적인 인터페이스와 Enum의 일반 확장

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); 
} 

을하지만 그것은해야 생각 으로이 작동하지 않습니다이를 위해 나는 (하지 작업을 수행하는)이 같은 EventHandler에 대한 인터페이스를 만들 수을하고 싶습니다.

이벤트 자체는 아주 간단 이는 일반 요소입니다 :

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); 
    } 
} 

내가 그것을 만드는 DefaultHandler<GameEvent<TypeEnum, AttributEnum>>() 같은이 때문에 여전히 일반적인 일이하고 싶은 HandlerInterface을 구현하는 경우. 그래서 인터페이스를 사용하여 자신의 핸들러를 만들거나 내가 제공하지만 여전히 자신의 Enum을 사용할 수있는 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> 

// 일반적인되지 않은 이행을하지 않는 테스트입니다 Enums
그래서 내가 뭘 잘못하고 있니? 내가 원하는 것을 할 수 있습니까?

답변

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

}