Обновление: Спасибо за каждого, кто помог - ответ на этот вопрос лежал в том, что я не замечал в своем более сложном коде и что я не знал о ковариантных возвращаемых типах Java5 ,Использование Java Generics with Enums
Оригинал сообщения:
Я играл вокруг с чем-то этим утром. Хотя я знаю, что я мог решить эту проблему по-другому, я нахожу себя одержимым, выясняя, почему он не работает так, как я ожидал. Проведя некоторое время, читая об этом, я нахожу, что я не ближе к пониманию, поэтому я предлагаю его в качестве вопроса, чтобы увидеть, насколько я просто глуп, или если я действительно не понимаю, что происходит здесь ,
Я создал пользовательские иерархии событий, как так:
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 определяется как:
Поэтому я думал, что это будет довольно просто, но оказывается, что вызов event.getId() приводит к тому, что компилятор говорит мне, что я не могу включить Enums, только конвертируемые значения int или константы перечисления.
Можно добавить следующий метод MyEvent:
public Type getId()
{
return super.getId();
}
После того, как я это делаю, все работает именно так, как я ожидал. Я не просто заинтересован в том, чтобы найти обходной путь для этого (потому что у меня, очевидно, есть), я интересуюсь любым прозрением, которое люди могут иметь, чтобы ПОЧЕМУ это не работает, поскольку я ожидал, что это спустится с места в карьер.
Крис, можете ли вы показать объявление класса класса, содержащего «fireEvent»? – notnoop
Проблема была в том, что мой AbstractEvent намного сложнее, чем то, что я разместил здесь. Я * должен * создать игрушку и проверить ее ** перед ** публикацией! Спасибо всем, кто помог! Вместо ответа было то, что мой метод getId() был «ковариантным типом возврата». У меня была другая реализация, похожая на класс, который был определен как возвращаемый тип Enum. Когда я отбросил это, оператор switch начал компилировать. –
-0 по крайней мере подходит к чистоте ... –