這個問題已被羅蘭庫恩在這post回答,但是,儘管幾個評論要求的細節,他沒有打擾分享完整的答案。在Akka保存類型參數收到
以下是我想要做的事情:我有一個包裝類case class Event[T](t: T)
,其中我將實例發送給Akka actor。在那個演員的receive
方法中,我然後想區分Event[Int]
和Event[String]
,由於類型擦除這顯然不是那麼簡單。
羅蘭·庫恩在這篇文章中分享的內容是「確實有一種方法可以做到」,即在消息中體現類型信息。所以我這樣做:
case class Event[T](t: T)(implicit val ct: ClassTag[T])
即使問不同的人提供它,羅蘭庫恩並沒有說什麼其實receive
方法中做呢。這是我的嘗試。
def receive = {
case e: Event =>
if (e.ct.runtimeClass == classOf[Int])
println("Got an Event[Int]!")
else if (e.ct.runtimeClass == classOf[String])
println("Got an Event[String]!")
else
println("Got some other Event!")
case _ =>
println("Got no Event at all!")
}
這是最好的我可以拿出來,因爲它很難將頭圍繞斯卡拉的反射叢林。這不是編譯,但:
value ct is not a member of Any
else if (e.ct.runtimeClass == classOf[String])
^
因此,我特別問的是receive
方法應該是什麼樣子。
這看起來是對的,我(除了它的簡單比較'ClassTag'直接:'e.ct == ClassTag.Int'和'e.ct == classTag [String]')。在錯誤信息中,你有's.ct',它不在代碼中。 –
將其更改爲'e.ct'。我簡化了上面的代碼,在這篇文章中是自包含的。但是,我從實際代碼複製粘貼的錯誤消息。好,趕快,謝謝! – lambdarookie
您還需要修復案例e:事件[_]'。在此之後,它編譯:http://scastie.org/23724。 –