Actualización: Gracias a todos los que ayudaron, la respuesta a esto radica en lo que no estaba notando en mi código más complejo y lo que no sabía sobre los tipos de retorno covariante Java5 .Uso de Java Generics con Enums
Post original:
he estado jugando con algo esta mañana. Si bien sé que I podría abordar este problema de manera diferente, estoy obsesionado con averiguar por qué no funciona de la manera que esperaba. Después de pasar un tiempo leyendo sobre esto, descubro que no estoy más cerca de la comprensión, así que lo ofrezco como una pregunta para ver si solo estoy siendo estúpido o si realmente hay algo que no entiendo que sucede aquí. .
He creado una jerarquía de eventos personalizados, así:
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;
}
}
Con una implementación concreta de este modo:
public class MyEvent
extends AbstractEvent<String, MyEvent.Type>
{
public enum Type { SELECTED, SELECTION_CLEARED };
public MyEvent(String src, Type t)
{
super(src, t);
}
}
Y entonces crear un evento de este modo:
fireEvent(new MyEvent("MyClass.myMethod", MyEvent.Type.SELECTED));
Donde mi fireEvent se define como:
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;
}
}
}
Así que pensé que esto sería bastante sencillo, pero resulta que la llamada a event.getId() hace que el compilador me diga que no puedo activar Enums, solo valores int convertibles o constantes enum.
Es posible añadir el siguiente método para MyEvent:
public Type getId()
{
return super.getId();
}
Una vez que haga esto, todo funciona exactamente como se esperaba que. No estoy solo interesado en encontrar una solución para esto (porque obviamente tengo uno), estoy interesado en cualquier idea que las personas puedan tener de por qué esto no funciona, como esperaba de inmediato.
Chris, ¿puedes mostrar la declaración de clase de clase que contiene 'fireEvent'? – notnoop
El problema fue que mi AbstractEvent es mucho más complicado que lo que publiqué aquí. ¡Yo * debería * haber creado la implementación del juguete y haberlo probado ** antes ** de publicar! ¡Gracias a todos los que ayudaron! La respuesta fue que mi método getId() era un 'tipo de retorno covariante' - tuve otra implementación enterrada en la clase que se definió como Enum tipo de devolución. Cuando abandoné eso, la instrucción switch comenzó a compilar. –
-0 para al menos estar limpio ... –