我一直忽略的 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/