Verwenden von Java Generics mit Enums

Aktualisieren: Vielen Dank für alle, die mitgeholfen haben. Die Antwort auf diese Frage lag darin, was ich in meinem komplexeren Code nicht bemerkt hatte und was ich nicht über die kovarianten Java5-Rückgabetypen wusste.

Ursprünglicher Beitrag:

Ich habe heute Morgen mit etwas rumgespielt. Während ich weiß, dass ichkönnte Ich bin besessen davon herauszufinden, warum es nicht so funktioniert, wie ich es erwartet hatte. Nachdem ich einige Zeit damit verbracht habe, darüber zu lesen, stelle ich fest, dass ich dem Verstehen nicht näher komme. Deshalb stelle ich die Frage, ob ich nur dumm bin oder ob es wirklich etwas gibt, das ich hier nicht verstehe .

Ich habe eine benutzerdefinierte Ereignishierarchie wie folgt erstellt:

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

Bei einer konkreten Umsetzung wie folgt:

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

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

Und dann erstelle ich so ein Event:

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

Wo mein fireEvent definiert ist als:

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

Daher dachte ich, dass dies ziemlich einfach sein würde, aber es stellte sich heraus, dass der Aufruf von event.getId () dazu führt, dass der Compiler mir mitteilt, dass ich Enums, nur konvertierbare Int-Werte oder Enum-Konstanten, nicht einschalten kann.

Es ist möglich, MyEvent die folgende Methode hinzuzufügen:

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

Sobald ich das mache, funktioniert alles genau so, wie ich es erwartet hatte. Ich bin nicht nur daran interessiert, eine Problemumgehung dafür zu finden (weil ich offensichtlich eine habe), sondern auch an Erkenntnissen, warum dies nicht so funktioniert, wie ich erwartet hatte.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage