Roland Kuhn 在这篇文章中已经回答了这个问题,然而,尽管有几条评论要求详细说明,但他并没有费心分享完整的答案。
这就是我想要做的:我有一个包装类case class Event[T](t: T)
,我将它的实例发送给 Akka 演员。在receive
那个演员的方法中,然后我想区分Event[Int]
and Event[String]
,由于类型擦除,这显然不是那么简单。
Roland Kuhn 在上述帖子中分享的是“只有一种方法可以做到”,即在消息中体现类型信息。所以我这样做了:
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
方法应该是什么样子。