2017-06-21 1 views
0

Je suis en train d'exécuter le receive method de Akka Actor de la manière suivante:Akka Recevez Lorsqu'on applique la méthode mutable.Map donne une erreur d'exécution

def receive = { 
    case x: collection.mutable.Map[String, collection.mutable.Map[String,Float]]=> 
    insertValueIntoTable(x) 
    } 

Je suis en mesure de compiler ce sans problème, mais je reçois l'erreur:

Error:(83, 57) ']' expected but '.' found. case x: collection.mutable.Map[String, collection.mutable.Map[String,Float]]=>

est-il une autre façon que je peux passer un mutable map qui a une value comme un autre mutable map? Toute aide est appréciée.

+2

La communication de l'acteur avec les messages mutables est une mauvaise idée, comme indiqué [ici] (http://doc.akka.io/docs/akka/current/scala/actors.html#messages-and-immutability) et [ici ] (http://doc.akka.io/docs/akka/current/scala/general/jmm.html#jmm-shared-state). – chunjef

+0

@chunjef Je peux intuitivement voir pourquoi c'est une mauvaise idée, sauf que j'ai besoin de la fonctionnalité de mutabilité en un seul acteur. Il est ensuite passé à un autre acteur pour être lu, plus aucun changement n'est appliqué. – Zzrot

Répondre

1

Il est important de mentionner que cette déclaration (si elle a travaillé) ne correspond à aucun mutable.Map en raison de type erasure:

[...] To implement generics, the Java compiler applies type erasure to:

  • Replace all type parameters in generic types with their bounds or Object if the type parameters are unbounded. The produced bytecode, therefore, contains only ordinary classes, interfaces, and methods.
  • [...]

Type erasure ensures that no new classes are created for parameterized types; consequently, generics incur no runtime overhead.

Pour contourner cela, vous pouvez simplement créer une classe wrapper qui porte votre carte:

case class MapMessage(map: mutable.Map[String, mutable.Map[String,Float]]) 

Et puis dans votre méthode receive:

def receive = { 
    case MapMessage(x)=> 
     insertValueIntoTable(x) 
} 

Quel que soit le type que vous voulez transmettre, il est généralement bon d'avoir case class es comme wrapper, et si ce n'est que pour donner un nom plus significatif au message.

En ce qui concerne l'erreur, il est difficile de dire sans plus de code, mais vous devriez contourner avec cette méthode de toute façon.

+0

Cela a fonctionné parfaitement! Je vous remercie. – Zzrot