Scala 的哪些特性允许 Props[SomeActor] 语法

What feature of Scala allows for Props[SomeActor] syntax

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

的语法
val props = Props[MyActor]

Q. Scala 中的什么机制允许以这种方式指定类型参数(即 [MyActor])?我假设这被转换为 Props 上的 constructor/apply 方法,该方法采用 Class 参数?例如,我的猜测是它等同于:

val props = Props(classOf[MyActor])

我一直假设 classOf 是 "special" 并以某种方式作弊以使用 [] 语法。因为我看到第 3 方库 Akka 使用相同的语法,所以看到一个简单的 REPL 示例会很棒,它演示了我如何将这种语法用于我自己的 classes。

Props 的实例最终是以下情况 class (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])

由于这是一个案例class,scala 将生成

的默认apply 方法
Props.apply(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any])

Props 伴生对象还有其他几个 apply 方法,它们使用默认的应用方法为您创建此 class 的实例。在Props[MyActor]的情况下,这是方法:

def apply[T <: Actor: ClassTag](): Props = apply(defaultDeploy, implicitly[ClassTag[T]].runtimeClass, List.empty)

Props[MyActor]Props.apply[MyActor]() 的语法糖。所以Props是利用ClassTag的反射能力来获取MyActor的运行时class,所以可以满足[=]的参数clazz: Class[_] 14=]案例class.

这是Scala ClassTag机制。例如:

object Test {
  def apply[T: ClassTag](s: String): Option[T] = ...
}

val foo = Test[Foo]("foo")

apply 方法中,您可以简单地执行类似

的操作
val ctor = implicitly[ClassTag[T]].runtimeClass.getConstructors.head

例如,为了访问 T 的第一个构造函数。