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