Scala的哪些功能允许使用Props [SomeActor]语法

时间:2015-11-10 08:30:24

标签: scala akka

阿卡的一个方面,我总是只是在经典的Hello World中出现!例。也就是说,创建Props类的语法:

val props = Props[MyActor]

问。 Scala中的哪种机制允许以这种方式指定类型参数(即[MyActor])?我假设这被转换为Props上带有Class参数的构造函数/ apply方法?例如,我的猜测相当于:

val props = Props(classOf[MyActor])

我一直认为classOf是特殊的"并以某种方式作弊以使用[]语法。因为我看到第三方库Akka使用了相同的语法,所以很高兴看到一个简单的REPL示例,它演示了如何将这种语法用于我自己的类。

2 个答案:

答案 0 :(得分:5)

道具的实例最终属于以下案例类(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])

由于这是一个案例类,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类。

答案 1 :(得分:1)

这是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的第一个构造函数。