2017-06-21 8 views
0

Ich versuche, die receive method von Akka Actor auf folgende Weise ausgeführt:Akka Methode Fall mutable.Map gibt einen Laufzeitfehler

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

ich in der Lage bin dies ohne Probleme zu kompilieren, aber ich der Fehler:

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

gibt es eine andere Art und Weise ich eine mutable map passieren kann, die eine value als eine andere mutable map hat? Jede Hilfe wird geschätzt.

+2

Akteur Kommunikation mit veränderlichen Nachrichten ist eine schlechte Idee, wie [hier] (http://doc.akka.io/docs/akka/current/scala/actors.html#messages-and-immutability) und [hier ] (http://doc.akka.io/docs/akka/current/scala/general/jmm.html#jmm-shared-state). – chunjef

+0

@chunjef Ich kann intuitiv sehen, warum das eine schlechte Idee ist, außer dass ich das Veränderlichkeitsmerkmal nur in einem Akteur brauche. Es wird dann an einen anderen Akteur weitergegeben, um gelesen zu werden, es werden keine Änderungen mehr vorgenommen. – Zzrot

Antwort

1

Es ist wichtig zu erwähnen, dass diese Aussage (wenn es funktioniert) aufgrund jeder mutable.Map zu type erasure passen würde:

[...] 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.

Um das zu bekommen, können Sie einfach eine Wrapper-Klasse erstellen, die Ihre Karte trägt:

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

Und dann in Ihrer Empfangsmethode:

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

Unabhängig von dem Typ, den Sie weitergeben möchten, ist es normalerweise gut, case class es als Wrapper zu haben, und wenn es nur der Nachricht einen aussagekräftigeren Namen geben soll.

In Bezug auf den Fehler ist es schwer, ohne mehr Code zu sagen, aber Sie sollten es mit dieser Methode sowieso umgehen.

+0

Das hat perfekt funktioniert! Vielen Dank. – Zzrot

Verwandte Themen