我想建立一个方便的功能,让阿克卡演员:
def makeActor[T](id: Int): ActorRef =
system.actorOf(Props(classOf[T], id, updater), "entity" + id)
makeActor[SomeActor](1) ! "Some Message"但这上面写着“类类型是必需的,但T是找到的”。这个密码有什么问题吗?
发布于 2014-03-12 16:48:13
在这里可以找到一个答案:Scala classOf for type parameter
您可以编写代码,例如:
def makeActor[T](id: Int)(implicit ev: Manifest[T]): ActorRef = system.actorOf(Props(ev.erasure, id, updater), "entity" + id)发布于 2014-03-12 16:45:29
为此使用scala反射,例如:
import scala.reflect._
def spawn[T <: Actor: ClassTag](id: Int) = system.actorOf(Props(classTag[T].runtimeClass, ...), s"entity$id")发布于 2014-03-12 17:15:40
充分发挥作用的例子:
import akka.actor.{ActorSystem, Props, Actor, ActorRef}
import scala.reflect.ClassTag
object TestActor extends App {
val system: ActorSystem = ActorSystem("rest-service-actor-system")
def makeActor[T <: Actor : ClassTag](id: Int): ActorRef =
system.actorOf(Props(implicitly[ClassTag[T]].runtimeClass), "entity" + id)
class A extends Actor {
override def receive = {
case anything => println("A GOT MESSAGE: " + anything)
}
}
class B extends Actor {
override def receive = {
case anything => println("B GOT MESSAGE: " + anything)
}
}
makeActor[A](1) ! "hello"
makeActor[A](2) ! "bye"
system.shutdown()
}通常打印:
A GOT MESSAGE: bye
A GOT MESSAGE: hello它强制您有一个类型也是一个Actor。例如,此代码将不会编译:
class C
makeActor[C](3)您得到的错误是:
type arguments [TestActor.C] do not conform to method makeActor's type parameter bounds [T <: akka.actor.Actor]
makeActor[C](3)
^https://stackoverflow.com/questions/22357778
复制相似问题