Использование 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();
}
Как только я это делаю, все работает именно так, как я ожидал. Я не просто заинтересован в поиске обходного пути для этого (потому что у меня, очевидно, есть такой способ), я заинтересован в том, чтобы у людей было понимание того, ПОЧЕМУ это не работает, поскольку я ожидал, что это сразу.