scala - Scala 的哪些特性允许使用 Props[SomeActor] 语法

标签 scala akka

我一直忽略的 Akka 的一个方面出现在规范的 Hello World 中!例子。即,创建 Props 的语法类(class):

val props = Props[MyActor]

Scala 中的什么机制允许以这种方式指定类型参数(即 [MyActor] )?我假设这被转换为 Props 上的构造函数/应用方法这需要一个 Class范围?例如,我的猜测是它相当于:
val props = Props(classOf[MyActor])

我一直假设 classOf是“特别的”并且以某种方式被欺骗以使用 []句法。因为我看到 Akka,一个 3rd 方库,使用相同的语法,所以很高兴看到一个简单的 REPL 示例来演示我如何在我自己的类中使用这种语法。

最佳答案

Prop 的实例最终属于以下案例类( https://github.com/akka/akka/blob/0511b07f3e50e0422379075ae76dd158e4d377fa/akka-actor/src/main/scala/akka/actor/Props.scala#L115 ):

final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any])

由于这是一个 case 类,scala 会生成默认的 apply的方法
Props.apply(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any])
Props伴生对象还有其他几个 apply使用默认的 apply 方法为您创建此类实例的方法。在Props[MyActor]的情况下,这是方法:
def apply[T <: Actor: ClassTag](): Props = apply(defaultDeploy, implicitly[ClassTag[T]].runtimeClass, List.empty)
Props[MyActor]Props.apply[MyActor]() 的语法糖.所以Props正在使用 ClassTag 的反射功能为了获得 MyActor 的运行时类,所以可以满足参数clazz: Class[_]Props案例类。

关于scala - Scala 的哪些特性允许使用 Props[SomeActor] 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33625695/

相关文章:

json - 在 Play Framework Scala 中列出 Json

java - 从不同特征继承同名方法

scala - 我该如何加入Option[Future[T]]?

scala - 在 Spark Scala 中使用滞后函数从另一列中获取值

scala - 进程间通信的静态类型参与者模型有什么不可行的地方吗?

scala - 关闭 Slick 注销

scala - 我应该使用 executeUpdate 还是 execute 删除带有 Anorm 的行?

java - 如何使用 akka BehaviourTestKit 从类型化上下文测试非类型化 Actor 部署?

Akka Actor 查找或依赖注入(inject)

http - 主机名验证和证书验证的 akka http SSLConfig 问题