2016-11-13 29 views
3

這個問題已被羅蘭庫恩在這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方法應該是什麼樣子。

+1

這看起來是對的,我(除了它的簡單比較'ClassTag'直接:'e.ct == ClassTag.Int'和'e.ct == classTag [String]')。在錯誤信息中,你有's.ct',它不在代碼中。 –

+0

將其更改爲'e.ct'。我簡化了上面的代碼,在這篇文章中是自包含的。但是,我從實際代碼複製粘貼的錯誤消息。好,趕快,謝謝! – lambdarookie

+1

您還需要修復案例e:事件[_]'。在此之後,它編譯:http://scastie.org/23724。 –

回答

1

固定誤差Event takes type parameters後:

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!") 
} 

代碼編譯。

import scala.reflect.{ClassTag, classTag} 

def receive = { 
    case e: Event[_] => 
    if (e.ct == ClassTag.Int) // or classTag[Int] 
     println("Got an Event[Int]!") 
    else if (e.ct == classTag[String]) 
     println("Got an Event[String]!") 
    else 
     println("Got some other Event!") 
    case _ => 
    println("Got no Event at all!") 
} 
0

你也可以做圖案的內部變量匹配的嵌套類中的:它可以用看的ClassTag S的內部(當然的ClassTag#equals的實施是要比較的類)稍微簡化更簡潔的這種情況下,您可以利用各種模式匹配技巧,你甚至不需要ClassTag:如

case class Event[T](t: T)  

def receive = { 
    case Event(t: Int) => 
    println("Int") 
    case Event((_: Float | _: Double)) => 
    println("Floating Point") 
    case Event(_) => 
    println("Other") 
}