Usando Java Generics con Enums

Actualizar: Gracias a todos los que ayudaron: la respuesta a esta pregunta fue lo que no noté en mi código más complejo y lo que no sabía sobre los tipos de retorno covariante de Java5.

Mensaje original:

He estado jugando con algo esta mañana. Si bien sé que yopodría abordando todo este problema de manera diferente, me estoy obsesionando con descubrir por qué no está funcionando de la manera que esperaba. Después de dedicar un tiempo a leer sobre esto, encuentro que no estoy más cerca de comprender, por lo que lo ofrezco como una pregunta para ver si simplemente estoy siendo estúpido o si realmente hay algo que no entiendo que esté sucediendo aquí. .

He creado una jerarquía de eventos personalizada como:

public abstract class AbstractEvent<S, T extends Enum<T>>
{
    private S src;
    private T id;

    public AbstractEvent(S src, T id)
    {
        this.src = src;
        this.id = id;
    }

    public S getSource()
    {
        return src;
    }

    public T getId()
    {
        return id;
    }
}

Con una implementación concreta como tal:

public class MyEvent
extends AbstractEvent<String, MyEvent.Type>
{
    public enum Type { SELECTED, SELECTION_CLEARED };

    public MyEvent(String src, Type t)
    {
        super(src, t);
    }
}

Y luego creo un evento así:

fireEvent(new MyEvent("MyClass.myMethod", MyEvent.Type.SELECTED));

Donde mi fireEvent se define como:

protected void fireEvent(MyEvent event)
{
    for(EventListener l : getListeners())
    {
        switch(event.getId())
        {
            case SELECTED:
                l.selected(event);
                break;
            case SELECTION_CLEARED:
                l.unselect(event);
                break;
         }
    }
}

Así que pensé que esto sería bastante sencillo, pero resulta que la llamada a event.getId () hace que el compilador me diga que no puedo activar Enums, solo valores int convertibles o constantes de enumeración.

Es posible agregar el siguiente método a MyEvent:

public Type getId()
{
    return super.getId();
}

Una vez que hago esto, todo funciona exactamente como lo esperaba. No solo estoy interesado en encontrar una solución alternativa para esto (porque obviamente tengo una), estoy interesado en cualquier idea que la gente pueda tener sobre POR QUÉ esto no funciona como esperaba que lo hiciera de inmediato.

Respuestas a la pregunta(5)

Su respuesta a la pregunta