2017-06-20 16 views
0

クリエータ関数を記述し、どのようなメッセージアクターが受信できるかを定義し、アクター内のこの種のメッセージにマッチさせることを目標としています。 だから私は、私は非常に単純なコードを持ってジェネリックパターンマッチングとタイプ消去

(私は関数を作成し呼び出す場合にのみ、このタイプを知っている)私の期待のメッセージがタイプXであることを指定したい:

import akka.actor.Actor.Receive 

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

このコードは私に次のエラーを与えます: "抽象的な型のパターンXは消し去られるのでチェックが外されている"

タイプの消去は分かっていますが、この問題の解決策は見つかりません。あなたのメッセージタイプは、型消去の影響を受けて自身であるならば、これは失敗することを

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

注意かかわら:

+0

あなたはhttp://daily-scala.blogspot.ca/2010/01/overcoming-type-erasure-in-matching-1.htmlを見ましたか? –

答えて

0

A ClassTagはかなりこれを処理します。たとえば、create[List[String]]はまだList[Int]を受け入れます。私はこの情報が実行時に完全になくなって以来、これを回避する手段はないと思います。

+3

「def create [X:ClassTag]:Receive = { case msg:X => } 'も同様に動作します – Kolmar

+0

ありがとう、これは私が探していたものです – Antek

関連する問題