【问题标题】:using scala generics in function definition在函数定义中使用 Scala 泛型
【发布时间】:2014-03-12 16:24:38
【问题描述】:

我想构建一个方便的函数来制作 akka 演员:

 def makeActor[T](id: Int): ActorRef =
   system.actorOf(Props(classOf[T], id, updater), "entity" + id)

 makeActor[SomeActor](1) ! "Some Message"

但这表示“需要类类型但找到了 T”。这段代码有什么问题?

【问题讨论】:

    标签: scala


    【解决方案1】:

    为此使用 scala 反射,例如:

    import scala.reflect._
    
    def spawn[T <: Actor: ClassTag](id: Int) = system.actorOf(Props(classTag[T].runtimeClass, ...), s"entity$id")
    

    【讨论】:

    • 我想你的意思是def spawn[T: ClassTag]。我无法提出修改建议,因为它太小了。
    【解决方案2】:

    可以在这里找到答案:Scala classOf for type parameter

    您可以像这样编写代码:

    def makeActor[T](id: Int)(implicit ev: Manifest[T]): ActorRef = system.actorOf(Props(ev.erasure, id, updater), "entity" + id)
    

    【讨论】:

    • 我使用了ev.runtimeClass,因为ev.erasure 在 2.10 中已被弃用。我已经编辑了你的帖子。谢谢!
    【解决方案3】:

    完整的工作示例:

    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)
               ^
    

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多