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