J'implémente un système d'événements GUI dans Scala. J'ai quelque chose comme:structure de données qui contient des fermetures, paramétriquement dans scala
case class EventObject
case class KeyEventObject extends EventObject
case class MouseEventObject extends EventObject
Je voudrais stocker les fermetures d'écouteur d'événements sur une carte (multi), comme suit:
var eventListeners = new MultiMap[EventDescriptor, (EventObject => Unit)];
Ma question est, est-il possible de réécrire cette façon que les signatures de fonction de la fermeture stockée peuvent être EventObject ou n'importe quelle sous-classe? Quelque chose comme ce qui suit:
var eventListeners = new MultiMap[EventDescriptor, [A <: EventObject](A => Unit)]
pour que je puisse avoir le sous-type connu quand je définit les fonctions d'auditeur:
eventListeners.put(KEY_EVENT, (e:KeyEventObject) => { ... })
eventListeners.put(MOUSE_EVENT, (e:MouseEventObject) => { ... })
Je dois dire que votre code est obsolète, vous devriez vérifier cette conversation: https://groups.google.com/forum/#!msg/scala-ide-dev/PyejSImLLtE/EbqqSKPUMisJ - et trouver des mots, "L'héritage d'un cas à l'autre est interdit" ... – idonnie
Je ne le savais pas, j'ai standardisé sur scala 2.9 mais peut-être il est temps de mettre à niveau. –
@DaveRafkind: C'est une bonne idée d'éviter l'héritage case à cas dans 2.9, aussi, où il n'est pas interdit mais entraînera des avertissements du compilateur. –