如何在Actor中接收一般事件

时间:2019-01-22 07:09:35

标签: scala akka 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不够了解,请帮助我解释为什么它不起作用以及如何解决

1 个答案:

答案 0 :(得分:0)

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

 List list = Arrays.asList("a","b");
 vars.putObject("list", list);