Używanie Java Generics z Enums

Aktualizacja: Dziękuję wszystkim, którzy pomogli - odpowiedź na to pytanie tkwiła w tym, czego nie zauważyłem w moim bardziej złożonym kodzie i czego nie wiedziałem o typach powrotu kowariantnych Java5.

Oryginalny post:

Bawiłem się z czymś dziś rano. Chociaż wiem, że jamógłby poradzę sobie z tym problemem inaczej, mam obsesję na punkcie zastanowienia się, dlaczego nie działa tak, jak oczekiwałem. Po spędzeniu trochę czasu na czytaniu w tej sprawie, uważam, że nie jestem bliżej zrozumienia, więc przedstawiam to jako pytanie, aby sprawdzić, czy po prostu jestem głupia lub czy jest coś, czego nie rozumiem tutaj .

Stworzyłem niestandardową hierarchię zdarzeń w taki sposób:

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

Dzięki konkretnej implementacji takiej jak ta:

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

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

A potem tworzę takie wydarzenie:

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

Gdzie mój fireEvent jest zdefiniowany jako:

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

Pomyślałem więc, że byłoby to całkiem proste, ale okazuje się, że wywołanie funkcji event.getId () powoduje, że kompilator mówi mi, że nie mogę włączyć Enums, tylko wymienialne wartości int lub stałe wyliczeniowe.

Możliwe jest dodanie następującej metody do MyEvent:

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

Kiedy to zrobię, wszystko działa dokładnie tak, jak tego oczekiwałem. Nie jestem zainteresowany znalezieniem obejścia tego problemu (ponieważ oczywiście mam takie rozwiązanie), interesuje mnie każdy wgląd, jaki ludzie mogą mieć na temat DLACZEGO to nie działa, ponieważ spodziewałem się, że od razu to zrobi.

questionAnswers(5)

yourAnswerToTheQuestion