更新:Props [MyActor]是否在Akka中创建了一个Props实例?

时间:2017-09-18 11:51:10

标签: scala akka

我正在学习Akka(在Scala中),并经常遇到以这种方式创建的Akka演员:

val myActor = system.actorOf(Props[MyActor], "myactor2")

我不明白这一点:我认为Props[MyActor]是一个类/类型,但不是类型为Props的{​​{1}}实例。 (我不确定我的理解是否正确)。

Props[MyActor]期望某个特定ActorSystem.actorOf()的{​​{1}}类型的实例。所以我的问题是,为什么它不是Props[T](附加括号)?

----更新@ 19日,9月----

我试过了......像Scala REPL中的这样:

T

并且发现system.actorOf(Props[MyActor](), "myactor2")的类型为object CX { def apply[T]() = new CX } class CX object CX2 { def apply() = new CX2 } class CX2 ,而val x2 = CX2实际上会创建CX2.type个实例。

val x = CX[Int]

这让我对CX创作感到困惑。

为什么scala> val x = CX[Int] x: CX = CX@3b51cbf7 scala> val x2 = CX2 x2: CX2.type = CX2$@11314183 不会像Props[T]那样创建CX个实例?是否有任何详细说明的文档或规范?

2 个答案:

答案 0 :(得分:2)

正如您已经指出的那样,

Props case类不接受类型参数,但apply的伴随对象的Props方法提供utility method }:

def apply[T <: Actor]()(implicit arg0: ClassTag[T]): Props

这是您的示例中使用的方法。

  

为什么不是system.actorOf(Props[MyActor](), "myactor2")(附加括号)?

你也可以这样做。这实际上就是您按照reccommended practice在演员的伴侣对象中创建props工厂方法时所做的事情。

- 9月19日更新 -

我认为你在这里混合了几件事。

首先,构建Props[T]。如前所述,它使用隐式ClassTag[T]来了解要构建的类型。可以找到有关TypeTagClassTag的更多信息here。因此,您添加的CXCX2示例与Props[T]方案实际上并不相同。

其次,对你的问题最重要的是,apply CX2对象上有括号,但是你在没有它们的情况下调用它。虽然这会编译(但它会给你一个警告),它会使你突出显示的混乱场景。这里的提示是val x2 = CX2类型为CX2.type - 这是CX2对象的类型,而不是类。 发生的事情是你有一个没有括号的def apply(),而且没有CX2对象实例本身的其他区别因素。因此,当你将它命名为而没有括号时,编译器就像&#34;我可以引用该对象的唯一方法是CX2,而apply可以通过CX2CX2()。然后我会假设CX2引用了对象而CX2()引用了apply&#34;。要验证发生了什么,您可以尝试val y = CX2()并注意它将具有您期望的类型。

希望这能澄清一下情景。

答案 1 :(得分:1)

Props的伴随对象有一个zero-argument apply method,它接受​​一个类型参数并为该类型创建一个默认的Props对象。 Props[MyActor]Props[MyActor]()在预期值的情境中是相同的(例如在调用system.actorOf时)。