阿卡,通用ActorRef?

问题描述 投票:0回答:3

我是相当新的斯卡拉所以这可能是一个简单的问题。我想放在一起阿卡一个简单的项目,我不知道如何处理的情况下,我需要一个参考存储到约束型的演员。假设我有一个演员特质

trait MyActorTrait extends Actor

然后,别的地方我想定义一个成员的另一个特点

def reference: ActorRef[MyActorTrait]

这显然是行不通的,因为ActorRef不关心目标演员的类型(或不是吗?)。有什么办法来约束reference只接受以扩展MyActorTrait演员参考?

scala generics akka actor
3个回答
2
投票

在设计上,也没有办法,你可以通过Actor访问底层ActorRef(或几乎任何其他方式)。因此,约束像你描述的是没有意义的类型,有将是你可以用ActorRef[Foo]ActorRef[Bar]做什么完全没有区别。

不是说,这是一件好事(在阿卡几件事情可以IMO这种方式的特点),不过这只是事情是这样的。


0
投票

你尝试在其他演员引用一个演员的方式是不正确的。演员形成一个层次。所以,它给你引用一个演员的路径。主要有三种方式,你可以使用引用其他演员

  • 绝对路径
 context.actorSelection("/user/serviceA")
  • 相对路径
context.actorSelection("../brother") ! msg
  • 查询逻辑演员层次
context.actorSelection("../*") ! msg

你可能有一个看DOC - https://doc.akka.io/docs/akka/2.5/general/addressing.html


0
投票

一些周围挖后,我相信我已经找到了一种方法。首先,我创建一个特点,这将保护演员类型

trait TypedActorRef[T <: Actor] {
  def reference: ActorRef
  type t = T
}

然后实现一个通用的适用的实例延长性状的私人案例类

object TypedActorRef {
  private case class Ref[T <: Actor] (reference: ActorRef) extends TypedActorRef[T]
  def apply[T <: Actor](actor: T) = {
    Ref[T](actor.self)
  }
}

随着我可以保持这也是制约我想要的类型的演员的参考。

trait OtherActor extends Actor

trait MyActor extends Actor
{
  def otherActorsReference: TypedActorRef[OtherActor]
}

这似乎确定以我来说,至少这似乎并没有打乱编译器,但我不知道,如果这个解决方案从创建可能不遵循相同的约束TypedActorRef的其他扩展阻止。

© www.soinside.com 2019 - 2024. All rights reserved.