2016-11-13 4 views
3

この質問は、postでRoland Kuhnによって回答されていますが、詳細を求めるいくつかのコメントにもかかわらず、彼は完全な回答を分かち合うことはありませんでした。Akkaでタイプ引数を保持する受信

私がやりたいことは次のとおりです。私はラッカークラスcase class Event[T](t: T)を持っており、そのインスタンスをAkkaアクタに送信します。その俳優のreceiveメソッドでは、Event[Int]Event[String]を区別したいと思います。これは明らかに型の削除のために簡単ではありません。

上記の記事でRoland Kuhnが共有しているのは、「正確には1つの方法があります」、つまりメッセージ内のタイプ情報を具現化しているということです。だから私はこれをしなかった:

それを提供するために、異なる人々によって尋ねたにもかかわらず
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!") 
} 

これはScalaの反射ジャングルの周りに自分の頭を包むのが難しいため、私が思いつくのは最高です。これは、しかし、コンパイルしていない:

value ct is not a member of Any 
else if (e.ct.runtimeClass == classOf[String]) 
     ^

はこのように、私は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!") 
} 

コードのコンパイル:エラーEvent takes type parametersを固定した後

+1

それが直接 'ClassTag'を比較する方が簡単だ除いてこれは(右の私になります:' e.ct == ClassTag.Int'と 'e.ct == classTag [String]')を呼び出します。エラーメッセージにはコード内には 's.ct'があります。 –

+0

'e.ct'に変更しました。私は上記のコードをこの記事で自己完結型に単純化しました。実際のコードからコピーしたエラーメッセージです。良いキャッチ、ありがとう! – lambdarookie

+1

また、 'case e:Event [_]'を修正する必要があります。その後、http://scastie.org/23724がコンパイルされます。 –

答えて

1

。あなたはまた、ネストされたクラス内の内部変数にパターンマッチングを行うことができます

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#equalsの実装クラスを比較するために起こっている)ClassTagの内側に見ていないことによって簡略化することができますその場合、それはより簡潔で、あなたは様々なパターンマッチングトリックを利用することができますし、あなたも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") 
} 
関連する問題