为什么 akka actor 使用 ActorRef 作为参数类型而不是类型本身?

Why akka actor use ActorRef as paramater's type rather then the type itselfs?

我已经阅读了很多演员定义的例子class来构建一个程序。我注意到他们都使用 ActorRef 作为参数类型。例如,

class LogProcessor(dbWriter: ActorRef)
    extends Actor with ActorLogging with LogParsing {

    import LogProcessor._

    def receive = {
      case LogFile(file) =>
        val lines: Vector[DbWriter.Line] = parse(file)
        lines.foreach(dbWriter ! _)
    }
}

dbWriter 的实际类型是 DBWriter 定义为:

class DbWriter(databaseUrl: String) extends Actor {
    val connection = new DbCon(databaseUrl)

    import DbWriter._
    def receive = {
      case Line(time, message, messageType) =>
        connection.write(Map('time -> time,
          'message -> message,
          'messageType -> messageType))
    }

    override def postStop(): Unit = {
      connection.close() 
    }
  }

在例子中,为什么不使用DbWriter作为dbWriter的类型?
如果我们在任何地方使用 ActorRef,程序看起来就像一个弱类型系统。
此外,Akka actor 使用 actorOf 方法创建子 actor,它 return ActorRef.I 也混淆了为什么不 return actor 的真实类型?

对演员的一些评论:

  • 我们可以通过调用 actorOf 或 actorFor
  • 创建一个 Actor 的多个实例
  • 我们为我们创建的任何 actor 实例分配不同的名称
  • 调用 actorOf 将 return 一个指向该实例的 ActorRef
  • 您只能通过 ActorRef 发送消息来与 Actor 实例通信,这样 actor 实例就被封装了,无法访问其内部状态
  • 使用 ActorRef 可以与本地或远程 actors 通信
  • 每个演员(child)有一个parent(另一个演员),parent是使用actorOf
  • 创建演员的人
  • parent决定其child人
  • 的监管策略
  • 通常,您创建一个 actor 的实例,并与希望与该 actor 通信的其他 actor 共享生成的 ActorRef