[]和()之间的区别,以创建新的Scala对象

时间:2017-10-18 23:00:15

标签: scala

只是看看Scala Akka并想知道以下对象初始化方法之间的区别。

system.actorOf(Props[HelloActor], name = "helloactor")

system.actorOf(Props(new HelloActor("Fred")), name = "helloactor")

我可以理解第二个Props(new HelloActor()),但第一个是什么,Props[HelloActor]?我不知道它的名字所以不能谷歌。

2 个答案:

答案 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的策略。在你的简单案例中,它最终使用反射来构建你的演员。