Использование Java Generics с Enums

Update: Спасибо всем, кто помог - ответ на этот вопрос заключался в том, что я не заметил в моем более сложном коде и что я не знал о ковариантных типах возвращаемых данных Java5.

Original Post:

Я этим утром что-то играл. Хотя я знаю, что яcould Решить эту проблему по-другому, я нахожу себя одержимым выяснением, почему это не работает так, как я ожидал. Потратив некоторое время на чтение этого, я не нахожу себя ближе к пониманию, поэтому я предлагаю это в качестве вопроса, чтобы посмотреть, не глупа ли я, или я действительно что-то не понимаю, что происходит здесь ,

Я создал пользовательскую иерархию событий примерно так:

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

С конкретной реализацией вот так:

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

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

И тогда я создаю событие так:

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

Где мой fireEvent определяется как:

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

Поэтому я подумал, что это будет довольно просто, но оказывается, что вызов event.getId () приводит к тому, что компилятор говорит мне, что я не могу включить Enums, только конвертируемые значения int или константы enum.

Можно добавить следующий метод в MyEvent:

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

Как только я это делаю, все работает именно так, как я ожидал. Я не просто заинтересован в поиске обходного пути для этого (потому что у меня, очевидно, есть такой способ), я заинтересован в том, чтобы у людей было понимание того, ПОЧЕМУ это не работает, поскольку я ожидал, что это сразу.

Ответы на вопрос(5)

Ваш ответ на вопрос