Usando Java Generics com Enums

Atualizar: Obrigado por todos que ajudaram - a resposta a esta foi o que eu não estava percebendo em meu código mais complexo e o que eu não sabia sobre os tipos de retorno da covariável Java5.

Post original:

Eu tenho brincado com algo esta manhã. Enquanto eu sei que eupoderia Enfrentar todo esse problema de maneira diferente, estou me vendo obcecado em descobrir por que não está funcionando da maneira que eu estava esperando. Depois de passar algum tempo lendo sobre isso, eu acho que não estou mais perto de entender, então eu ofereço isso como uma pergunta para ver se eu estou apenas sendo estúpida ou se há realmente algo que eu não entendo acontecendo aqui .

Eu criei uma hierarquia de eventos personalizada da seguinte forma:

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

Com uma implementação concreta como esta:

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

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

E então eu crio um evento assim:

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

Onde meu fireEvent é definido 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;
         }
    }
}

Então eu pensei que isso seria bastante simples, mas acontece que a chamada para event.getId () resulta no compilador dizendo que não posso ativar Enums, apenas valores int conversíveis ou constantes enum.

É possível adicionar o seguinte método ao MyEvent:

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

Depois de fazer isso, tudo funciona exatamente como eu esperava. Eu não estou apenas interessado em encontrar uma solução para isso (porque eu obviamente tenho um), estou interessado em qualquer insight que as pessoas possam ter sobre o porque isso não funciona como eu esperava logo de cara.

questionAnswers(5)

yourAnswerToTheQuestion