Akka,通用ActorRef?

时间:2019-02-04 12:31:06

标签: scala generics akka actor

我对Scala还是很陌生,所以这可能是一个琐碎的问题。我正在尝试在Akka中建立一个简单的项目,并且不确定如何处理需要存储对约束类型的actor的引用的情况。 假设我有演员特质

trait MyActorTrait extends Actor

然后在其他地方我想用成员定义另一个特征

def reference: ActorRef[MyActorTrait]

这显然是行不通的,因为ActorRef不在乎目标actor的类型(或者是吗?)。有什么方法可以约束reference只接受对扩展MyActorTrait的参与者的引用?

3 个答案:

答案 0 :(得分:2)

根据设计,您无法通过Actor访问底层的ActorRef(或者几乎是任何其他方式)。因此,约束您描述的类型是没有意义的,ActorRef[Foo]ActorRef[Bar]的处理方式绝对没有区别。

不用说,这是一件好事(Akka中很少有东西可以用IMO来表征),但这就是事实。

答案 1 :(得分:0)

尝试引用另一个演员中的演员的方法不正确。参与者形成一个层次结构。因此,它为您提供了一个介绍演员的途径。您可以使用以下三种主要方式来引用其他演员

  • 绝对路径
 context.actorSelection("/user/serviceA")
  • 相对路径
context.actorSelection("../brother") ! msg
  • 查询逻辑参与者层次结构
context.actorSelection("../*") ! msg

您可以查看文档-https://doc.akka.io/docs/akka/2.5/general/addressing.html

答案 2 :(得分:0)

经过一番挖掘,我相信我找到了一种方法。 首先,我创建一个特征以保留演员类型

-

然后实现一个通用应用,该应用实例化扩展特质的私人案例类

def trimEnd(s):
    if ':' in s:
        s = s[:s.index(':')]
    if '-' in s:
        s = s[:s.index('-')]
    return s

a = 'ABCD: PQRS XYZ'
b = 'qwerty-asd zxc'
print(trimEnd(a))
print(trimEnd(b))

这样我就可以保留一个引用,该引用被限制为想要的类型的演员。

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

这对我来说似乎是可以的,至少这似乎不会使编译器感到不安,但是我不确定此解决方案是否阻止创建TypedActorRef的其他扩展,而这些扩展可能不遵循相同的约束。