我正在学习Akka(在Scala中),我经常遇到以这种方式创建的Akka演员:
val myActor = system.actorOf(Props[MyActor], "myactor2")
我不明白这一点:我认为Props[MyActor]
是一个类/类型,但不是类型Props[MyActor]
的Props
实例。(我不确定我的理解是否正确)。
ActorSystem.actorOf()
需要某些特定T
的类型为Props[T]
的实例。所以我的问题是,为什么不system.actorOf(Props[MyActor](), "myactor2")
(附加括号)?
----更新@19th,9月----
我在 Scala REPL 中尝试了这样的 sth:
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
不像CX[Int]
那样创建CX
实例?是否有任何文档或规范对此进行了详细说明?
正如你已经指出的Props
case class不采用类型参数,但是Props
的 companion 对象的apply
方法提供了一个实用方法:
def apply[T <: Actor]()(implicit arg0: ClassTag[T]): Props
这是您的示例中使用的方法。
为什么不
system.actorOf(Props[MyActor](), "myactor2")
(附加括号)?
当然,你也可以这样做。当您遵循在参与者的伴随对象中创建props
工厂方法的推荐做法时,这就是您实际上所做的。
--9月19日更新 --
我认为你在这里混合了几件事。
一是Props[T]
建设。如前所述,它使用隐式ClassTag[T]
来了解要构建的类型。有关TypeTag
和ClassTag
的更多信息,请点击此处。因此,您添加的CX
和CX2
示例实际上与Props[T]
方案并不相同。
其次,对于你的问题来说,也是最重要的,CX2
对象上的apply
有括号,但你没有括号就调用它。虽然这将编译(但它会给你一个警告),但它会使你突出显示的混乱场景。这里的提示是val x2 = CX2
是类型CX2.type
- 这是CX2
对象的类型,而不是类的类型。 正在发生的事情是,您有一个没有括号的def apply()
,也没有与CX2
对象实例本身的其他区别因素。因此,当您不带括号调用它时,编译器会像"我可以引用对象的唯一方法是CX2
,而apply
可以由CX2
和CX2()
引用。然后,我将假设CX2
指的是对象,CX2()
是指apply
"。若要验证是否正在发生,可以尝试val y = CX2()
并注意它将具有所需的类型。
希望这能澄清一些情况。
Props的配套对象有一个零参数应用方法,该方法采用类型参数并为该类型创建默认的 Props 对象。Props[MyActor]
和Props[MyActor]()
在期望值的上下文中是一回事(例如,在调用system.actorOf
时)。