【问题标题】:Creating a generic actor subclass that also takes a constructor parameter创建一个通用的actor子类,它也接受一个构造函数参数
【发布时间】:2014-07-07 22:41:34
【问题描述】:

我有以下代码,其中T 是一个演员子类,它也应该接受一个构造函数参数:

abstract class AbstractActor(dest: ActorRef) extends Actor {
  //...
}

class ChildActor(dest: ActorRef) extends AbstractActor(dest) {
  //...
}

class ParentActor[T <: AbstractActor : ClassTag] extends Actor {
  val childRef = context.actorOf(Props(classOf[T], destActorRef))
  //...
}

编译器给出错误:“class type required but T found”。我认为问题是也可以在没有构造函数参数的情况下定义 childActor:

class ChildActor extends AbstractActor(dest) {
  //...
}

所以,我尝试了:

class ParentActor[T <: AbstractActor : ClassTag] extends Actor {

  def createT(dest: ActorRef)(implicit ev: Manifest[T]): ActorRef =
    context.actorOf(Props(ev.runtimeClass, dest))

  val childRef = createT(destActorRef)
  //...
}

然后我得到:“没有可用于 T 的清单”。关于我做错了什么的任何想法?谢谢

【问题讨论】:

标签: scala akka scala-2.10


【解决方案1】:

在第一次尝试中,您的代码因classOf[T] 而失败。 classOf 需要被赋予显式类,它不能与类型参数一起使用,即使它有 ClassTag

在第二次尝试中,T 类型需要 ClassTag,但 createT 需要 ManifestManifestClassTag 的子类型,可用的ClassTag 不能安全地向下转换为Manifest。不过,您已经很接近了,将要求更改为 [T &lt;: AbstractActor : Manifest] 并且您的代码应该可以工作。

【讨论】:

  • 鉴于 Manifest 显然在未来的某个时间点会消失,看看用 ClassTag 替换它有什么陷阱吗?所以我们应该有(implicit tag: ClassTag[T]),然后是Props(tag.runtimeClass, dest)
  • 看来搬到ClassTag 是正确的选择。
猜你喜欢
  • 2015-07-16
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多