首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在函数定义中使用scala泛型

在函数定义中使用scala泛型
EN

Stack Overflow用户
提问于 2014-03-12 16:24:38
回答 3查看 95关注 0票数 0

我想建立一个方便的功能,让阿克卡演员:

代码语言:javascript
复制
 def makeActor[T](id: Int): ActorRef =
   system.actorOf(Props(classOf[T], id, updater), "entity" + id)

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

但这上面写着“类类型是必需的,但T是找到的”。这个密码有什么问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-12 16:48:13

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

您可以编写代码,例如:

代码语言:javascript
复制
def makeActor[T](id: Int)(implicit ev: Manifest[T]): ActorRef = system.actorOf(Props(ev.erasure, id, updater), "entity" + id)
票数 2
EN

Stack Overflow用户

发布于 2014-03-12 16:45:29

为此使用scala反射,例如:

代码语言:javascript
复制
import scala.reflect._

def spawn[T <: Actor: ClassTag](id: Int) = system.actorOf(Props(classTag[T].runtimeClass, ...), s"entity$id")
票数 3
EN

Stack Overflow用户

发布于 2014-03-12 17:15:40

充分发挥作用的例子:

代码语言:javascript
复制
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()
}

通常打印:

代码语言:javascript
复制
A GOT MESSAGE: bye
A GOT MESSAGE: hello

它强制您有一个类型也是一个Actor。例如,此代码将不会编译:

代码语言:javascript
复制
class C

makeActor[C](3)

您得到的错误是:

代码语言:javascript
复制
type arguments [TestActor.C] do not conform to method makeActor's type parameter bounds [T <: akka.actor.Actor]
  makeActor[C](3)
           ^
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22357778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档