如何在 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]]
}