首页 > 解决方案 > 如何在 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不够了解,请帮我解释为什么它不起作用以及如何解决它

标签: scalaakkaactor

解决方案


由于类型擦除,它不起作用。在运行时,任何实例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]]
}

推荐阅读