À l'aide de Java Génériques avec les Énumérations

Mise à jour: Merci pour tous ceux qui ont aidé la réponse à cette une résidait dans ce que je n'étais pas le remarquer dans mon code plus complexe et ce que je ne savais pas à propos de la Java5 covariante des types de retour.

Original Post:

J'ai été jouer avec quelque chose ce matin. Même si je sais que je pourrait s'attaquer à ce problème différemment, je suis la recherche de moi-même obsédé par comprendre pourquoi ça ne fonctionne pas de cette façon que je m'attendais. Après avoir passé quelque temps à la lecture de autour de sur ce, je trouve que je suis pas près de comprendre, donc je vous l'offre comme une question pour voir si je vais être stupide ou si il y a vraiment quelque chose que je ne comprends pas ici.

J'ai créé un Événement personnalisé hiérarchie comme suit:

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

Avec une mise en œuvre concrète de la sorte:

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

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

Puis-je créer un événement de la sorte:

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

Où mon fireEvent est défini comme:

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

Donc j'ai pensé que ce serait assez simple, mais il s'avère que l'appel à la manifestation.getId() résultats dans le compilateur me dit que je ne peut pas passer sur les Enums, seulement convertibles valeurs int ou enum constantes.

Il est possible d'ajouter la méthode suivante pour MyEvent:

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

Une fois que je fais cela, tout fonctionne exactement comme je l'attendais. Je ne suis pas seulement intéressé à trouver une solution de contournement pour ce (parce que j'ai bien évidemment), je suis intéressé par toute réflexion gens ont peut-être POURQUOI cela ne fonctionne pas comme je m'y attendais à droite au large de la chauve-souris.

  • Chris, pouvez-vous montrer à la déclaration de classe de la classe contenant fireEvent?
  • Le problème est vraiment que mon AbstractEvent est beaucoup plus compliqué que ce que j'ai posté ici. Je devrais avoir créé le jouet de la mise en œuvre et testé avant affichage! Merci pour tous ceux qui ont aidé! Que la réponse était que mon getId() la méthode est un "covariant type de retour' - j'ai eu une autre mise en œuvre enterré dans la classe qui a été défini comme Enum<T> type de retour. Lorsque j'ai abandonné que, l'instruction switch a commencé à établir.
  • -0 pour au moins venir nettoyer...
InformationsquelleAutor Chris Boran | 2009-07-23