我有以下代码,其中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))
//...
}
编译器给出了错误:&#34;需要类类型但是找到T&#34;。我假设问题是,也可以在没有构造函数参数的情况下定义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)
//...
}
然后我得到:&#34; T&#34;没有可用的清单。关于我做错什么的任何想法?谢谢
答案 0 :(得分:1)
在第一次尝试中,您的代码因classOf[T]
而失败。 classOf
需要提供一个明确的类,它不能使用类型参数,即使它有ClassTag
。
在第二次尝试中,您需要ClassTag
类型T
,但createT
需要Manifest
。 Manifest
是[{1}}的子类型,可用的ClassTag
无法安全地转发到ClassTag
。你很接近,将要求改为Manifest
,你的代码应该可以工作。