阿卡的一个方面,我总是只是在经典的Hello World中出现!例。也就是说,创建Props
类的语法:
val props = Props[MyActor]
问。 Scala中的哪种机制允许以这种方式指定类型参数(即[MyActor]
)?我假设这被转换为Props
上带有Class
参数的构造函数/ apply方法?例如,我的猜测相当于:
val props = Props(classOf[MyActor])
我一直认为classOf
是特殊的"并以某种方式作弊以使用[]
语法。因为我看到第三方库Akka使用了相同的语法,所以很高兴看到一个简单的REPL示例,它演示了如何将这种语法用于我自己的类。
答案 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
的第一个构造函数。