我是相当新的斯卡拉所以这可能是一个简单的问题。我想放在一起阿卡一个简单的项目,我不知道如何处理的情况下,我需要一个参考存储到约束型的演员。假设我有一个演员特质
trait MyActorTrait extends Actor
然后,别的地方我想定义一个成员的另一个特点
def reference: ActorRef[MyActorTrait]
这显然是行不通的,因为ActorRef不关心目标演员的类型(或不是吗?)。有什么办法来约束reference
只接受以扩展MyActorTrait
演员参考?
在设计上,也没有办法,你可以通过Actor
访问底层ActorRef
(或几乎任何其他方式)。因此,约束像你描述的是没有意义的类型,有将是你可以用ActorRef[Foo]
与ActorRef[Bar]
做什么完全没有区别。
不是说,这是一件好事(在阿卡几件事情可以IMO这种方式的特点),不过这只是事情是这样的。
你尝试在其他演员引用一个演员的方式是不正确的。演员形成一个层次。所以,它给你引用一个演员的路径。主要有三种方式,你可以使用引用其他演员
context.actorSelection("/user/serviceA")
context.actorSelection("../brother") ! msg
context.actorSelection("../*") ! msg
你可能有一个看DOC - https://doc.akka.io/docs/akka/2.5/general/addressing.html。
一些周围挖后,我相信我已经找到了一种方法。首先,我创建一个特点,这将保护演员类型
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的其他扩展阻止。