只是看看Scala Akka并想知道以下对象初始化方法之间的区别。
system.actorOf(Props[HelloActor], name = "helloactor")
和
system.actorOf(Props(new HelloActor("Fred")), name = "helloactor")
我可以理解第二个Props(new HelloActor())
,但第一个是什么,Props[HelloActor]
?我不知道它的名字所以不能谷歌。
答案 0 :(得分:2)
Scala中的方括号[]
表示使用generic class。泛型类是将类型作为参数的类。泛型类的实例化中括号之间的类名是该类型参数的参数。
因此,在您的情况下,Props
类有1个泛型参数,而行Props[HelloActor]
提供类型HelloActor
作为该泛型参数的参数。
答案 1 :(得分:2)
道具是一个带有伴侣对象的案例类。在Scala代码中,您将看到人们构建对象的两种主要方式。一个是类的构造函数。另一种主要方法是在伴随对象上调用apply()
方法。
如果查看akka.actor.Props
的源代码,您会注意到随播对象有四种apply()
方法,其中两种方法是您在上面的代码中引用的。在撰写本文时,他们的签名是:
def apply[T <: Actor: ClassTag](): Props
def apply[T <: Actor: ClassTag](creator: ⇒ T): Props
作为有用的糖,Scala允许您在不声明apply方法的情况下调用apply方法,因此在第一个示例中,您可以将其重写为Props[HelloActor]()
,并且编译器会为您插入apply()
方法。接下来,如果方法没有参数,则可以省略括号。因此,如上所述,呼叫变为Props[HelloActor]
。
您的第二个示例调用第二个apply()
方法。
关于真正的HelloActor类如何实例化的问题,这个问题有点复杂。所有明确定义的apply()
方法最终都会调用一个特殊的apply()
方法,该方法由Props作为案例类的性质生成。这个apply调用Props上的构造函数,它创建了一个akka.actor.IndirectActorProducer。该类包含许多可用于实例化actor的策略。在你的简单案例中,它最终使用反射来构建你的演员。