2017-06-20 68 views
0

目標是編寫創建者函數,定義參與者可以接收什麼類型的消息,並在演員內部匹配這類消息。 所以我想指定我期望的消息是X型的(我知道這類型只有當我調用創建函數)通用模式匹配和類型擦除

我有非常簡單的代碼:

import akka.actor.Actor.Receive 

def create[X]():Receive = { 
    case msg:X => 
} 

此代碼給我下面的錯誤:「抽象類型模式X是未選中的,因爲它被刪除消除」

我知道什麼是類型擦除,但我找不到任何解決方案爲這個問題。

+0

你見過http://daily-scala.blogspot.ca/2010/01/overcoming-type-erasure-in-matching-1.html嗎? –

回答

0

一個ClassTag會非常處理這個問題:

def create[X](implicit tag: ClassTag[X]): Receive = { 
    case msg if msg.getClass == tag.runtimeClass => 
} 

注意的是,如果你的消息類型本身受類型擦除,這將失敗。例如,create[List[String]]仍然會接受List[Int]。我認爲沒有辦法解決這個問題,因爲這些信息在運行時完全消失了。

+3

只需'def create [X:ClassTag]:Receive = {case msg:X => }'也可以工作 – Kolmar

+0

謝謝,這正是我正在尋找的 – Antek