この質問は、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
を固定した後
それが直接 'ClassTag'を比較する方が簡単だ除いてこれは(右の私になります:' e.ct == ClassTag.Int'と 'e.ct == classTag [String]')を呼び出します。エラーメッセージにはコード内には 's.ct'があります。 –
'e.ct'に変更しました。私は上記のコードをこの記事で自己完結型に単純化しました。実際のコードからコピーしたエラーメッセージです。良いキャッチ、ありがとう! – lambdarookie
また、 'case e:Event [_]'を修正する必要があります。その後、http://scastie.org/23724がコンパイルされます。 –