Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 创建还接受构造函数参数的泛型actor子类_Scala_Akka_Scala 2.10 - Fatal编程技术网

Scala 创建还接受构造函数参数的泛型actor子类

Scala 创建还接受构造函数参数的泛型actor子类,scala,akka,scala-2.10,Scala,Akka,Scala 2.10,我有以下代码,其中T是一个actor子类,它也应该接受一个构造函数参数: abstract class AbstractActor(dest: ActorRef) extends Actor { //... } class ChildActor(dest: ActorRef) extends AbstractActor(dest) { //... } class ParentActor[T <: AbstractActor : ClassTag] extends Actor {

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

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 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)
  //...
}

class ParentActor[T在第一次尝试中,您的代码失败,因为
classOf[T]
classOf
需要指定一个显式类,它不能使用类型参数,即使它有
ClassTag


在第二次尝试中,您需要类型
T
ClassTag
,但是
createT
需要
清单
清单
清单
ClassTag
的一个子类型,并且可用的
ClassTag
不能安全地向下转换为
清单
。如果您很接近,请更改要求请记住
[T对于“没有可用于T的清单”部分,此线程可能会有所帮助:鉴于清单在将来某个时候明显会消失,请查看用ClassTag替换它是否存在任何陷阱?因此,我们将使用
(隐式标记:ClassTag[T])
,然后使用
道具(tag.runtimeClass,dest)
insteadIt看起来移动到
ClassTag
是正确的选择。
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)
  //...
}