這是akka actor的接收內部的模式匹配問題。特徵中某個對象內部的類型是什麼
我有這樣的代碼:
class ActorReservation(reservation: Reservation) extends Actor {
import Entry._
import Customer._
def receive: Actor.Receive = messages
def messages: Receive = {
case Entry.Get.Result(obj) => // process entry
case Customer.Get.Result(obj) => // process customer
}
def test: Receive = {
case e =>
println(s"ClassName -> ${e.getClass.getName}")
println(s"isInstanceOf[GenericMessages#Get] -> ${isInstanceOf[GenericMessages[AppAny]#Get]}")
}
}
object Entry extends GenericMessages[EntryEntity]
object Customer extends GenericMessages[CustomerEntity]
trait GenericMessages[A <: AppAny] {
case class Get(id: Int)
object Get { case class Result(obj: Option[A]) }
} //trait
trait AppAny
case class EntryEntity(id: Int) extends AppAny
case class CustomerEntity(id: Int) extends AppAny
我的演員能得到兩個信息:當它接收到的第一個一切順利找到,但當第二個到達它拋出和異常Customer
可以投Entry.Get.Result
,Customer.Get.Result
,到Entry
,這是因爲第二條消息被第一條case
所捕獲。
然後我改變與
def receive: Actor.Receive = test
兩個消息顯示相同的類名GenericMessages$Get$Result
接收,所以這就是爲什麼這兩個消息落在第一case
。
我試圖創建與GenericMessages#Get
兩個消息的通用case
但是這使得引用的類Get
內GenericMessages
而不是對象Get
。
所以,我的問題是:有沒有辦法引用GenericMessages
特性的Get
對象中的Result
類?有沒有另外一種方法可以使case
避免這種模式匹配問題?
附加信息: 真正的男主角是一個普通演員的實現,因爲我需要在其他演員一樣的行爲。
消息Entry.Get.Result
,Customer.Get.Result
是由同一個演員(anotherActor ! Customer.Get
)發送的先前消息的響應,並且以這種方式實現,因爲我傾向於並行調用而不是線性調用。線性解決方案是使用一種方法接收第一條消息,而不是使用become
更改爲另一個接收並處理第二條消息。我想避免這種線性方法,因爲1.我更喜歡它是一個並行進程,2.它打破了我所做的抽象。
是不是像說「你怎麼我區分龍在兩個不同的類?」他們本質上是一樣的,不是嗎?需要有一些外部方法(不在Long實例內)來確定Long實例屬於哪個類。 – bjfletcher