我正在学习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
个实例?是否有任何详细说明的文档或规范?
答案 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]
来了解要构建的类型。可以找到有关TypeTag
和ClassTag
的更多信息here。因此,您添加的CX
和CX2
示例与Props[T]
方案实际上并不相同。
其次,对你的问题最重要的是,apply
CX2
对象上有括号,但是你在没有它们的情况下调用它。虽然这会编译(但它会给你一个警告),它会使你突出显示的混乱场景。这里的提示是val x2 = CX2
类型为CX2.type
- 这是CX2
对象的类型,而不是类。
发生的事情是你有一个没有括号的def apply()
,而且没有CX2
对象实例本身的其他区别因素。因此,当你将它命名为而没有括号时,编译器就像&#34;我可以引用该对象的唯一方法是CX2
,而apply
可以通过CX2
和CX2()
。然后我会假设CX2
引用了对象而CX2()
引用了apply
&#34;。要验证发生了什么,您可以尝试val y = CX2()
并注意它将具有您期望的类型。
希望这能澄清一下情景。
答案 1 :(得分:1)
Props的伴随对象有一个zero-argument apply method,它接受一个类型参数并为该类型创建一个默认的Props对象。 Props[MyActor]
和Props[MyActor]()
在预期值的情境中是相同的(例如在调用system.actorOf
时)。