如何在 Actor 中接收通用事件
How to receive Generic Event in Actor
我尝试编写一个通用 Actor,它可以接收通用事件
case class CreateEvent[T](t: T)
trait MyBaseActor[Type] extends Actor {
override def receive: Receive = {
case CreateEvent(t: Type) => ....
}
}
然后,我创建一个真正的演员
case class HasName(name: String)
class MyActor extends MyBaseActor[HasName]
而且我希望 MyActor
也可以处理消息 Create(HasName("hello")
。但是当我编译代码时,我收到了这个警告:
abstract type pattern Type is unchecked since it is eliminated by erasure
我的演员也无法收到 CreateEvent
。也许我对 scala 中的 Generic 了解不够,请帮我解释一下为什么它不起作用以及如何修复它
由于类型擦除,它不起作用。在运行时,CreateEvent
的任何实例都具有类型 CreateEvent[Object]
,因此您无法匹配其通用类型。
要解决此问题,您可以使用 ClassTag
:
trait MyBaseActor[Type] extends Actor {
val classTag: ClassTag[Type]
override def receive: Receive = {
case CreateEvent(t) if classTag.runtimeClass.isInstance(t) =>
val typedT: Type = t.asInstanceOf[Type]
....
}
}
class MyActor() extends MyBaseActor[HasName] {
override final val classTag: ClassTag[HasName] = implicitly[ClassTag[HasName]]
}
我尝试编写一个通用 Actor,它可以接收通用事件
case class CreateEvent[T](t: T)
trait MyBaseActor[Type] extends Actor {
override def receive: Receive = {
case CreateEvent(t: Type) => ....
}
}
然后,我创建一个真正的演员
case class HasName(name: String)
class MyActor extends MyBaseActor[HasName]
而且我希望 MyActor
也可以处理消息 Create(HasName("hello")
。但是当我编译代码时,我收到了这个警告:
abstract type pattern Type is unchecked since it is eliminated by erasure
我的演员也无法收到 CreateEvent
。也许我对 scala 中的 Generic 了解不够,请帮我解释一下为什么它不起作用以及如何修复它
由于类型擦除,它不起作用。在运行时,CreateEvent
的任何实例都具有类型 CreateEvent[Object]
,因此您无法匹配其通用类型。
要解决此问题,您可以使用 ClassTag
:
trait MyBaseActor[Type] extends Actor {
val classTag: ClassTag[Type]
override def receive: Receive = {
case CreateEvent(t) if classTag.runtimeClass.isInstance(t) =>
val typedT: Type = t.asInstanceOf[Type]
....
}
}
class MyActor() extends MyBaseActor[HasName] {
override final val classTag: ClassTag[HasName] = implicitly[ClassTag[HasName]]
}