Tupel sind generische Typen, z.B. Tuple2[T1, T2]
und in der JVM sind diese Typparameter gelöscht und nicht in der Laufzeit vorhanden. Es gibt eine Menge zu diesem Thema online.
Ihr Code funktioniert, aber nur die Sache, die überprüft wird, um zu sehen, ob Nachricht mit dem Muster übereinstimmt, ist, wenn die Nachricht Tuple2
ist, nicht inner seine Typen. Wenn dieser Aktor einen anderen Tuple2
bekommt, sagen wir (String, String)
, erhalten Sie eine Klassenausnahme beim Versuch, String
in Long
zu konvertieren, wenn Sie versuchen, das erste Element an die Methode sendPlace
zu übergeben.
Zum Beispiel in folgenden
override def receive: Receive = {
case tuple: (Long, DateTime) => sendPlace(tuple._1, tuple._2)
case tuple: (Int, Int) => sender ! (tuple._1 + tuple._2)
}
zweite Muster nicht erreichbar ist, wird es nie übereinstimmen, wie jeder Tuple2
auf das erste Muster und throw Ausnahme übereinstimmen, wenn der Typ nicht stimmt.
Im Allgemeinen sollten Sie Fallklassen für Nachrichten erstellen. Dies hat den Vorteil eines aussagekräftigen Namens sowohl für die Nachricht als auch für ihre Mitglieder, Tupel sagt nichts weiter als seine Typen. Sie sollten die Nachrichten definieren, die der Akteur in seinem Begleitobjekt verarbeiten kann.
object BookingActor {
case class BookingRequest(placeId: Long, bookingTime: DateTime)
}
class BookingActor {
import BookingActor._
override def receive: Receive = {
case BookingRequest(id, time) => bookPlace(id, time)
}
// ...
}
Gute Antwort danke, bitte, dass in der realen Code beachten Sie die Namen aussagekräftiger sind, und ich denke, dass es genug verständlich ist und seit zwei Anwendungen kommunizieren miteinander erlaubt es mir nicht, um die Case-Klasse zweimal zu definieren, würde ich lieber ein Tupel verwenden. Kannst du bitte, bitte, erklären, warum ich diese Warnung nicht bekomme, wenn sie nicht im Kontext eines Schauspielers steht, der eine Nachricht erhält?Ersetzt die JVM das Tupel durch eine Fallklasse? – Simon