我有一个定义为这样的演员:
class nodeActor(ID: String) extends Actor
它包含一个方法,它是用来建立男主角它开始之前:
def addRef(actor:ActorRef)
我实例化这个演员像这样:
val node1 = system.actorOf(Props(new nodeActor("node1")), name="node1")
返回我的ActorRef。 编译器不会让我打电话“的AddRef”上ActorRef,因为它的亚型中的一员。 所以我用投节点:
node1.asInstanceOf[nodeActor].addRef(link1)
这使编译器高兴。 然后,在运行时,我得到
java.lang.ClassCastException: akka.actor.LocalActorRef cannot be cast to ActorStressTest.nodeActor
这并不甚至似乎是有意义的我,因为它是一个亚型,我应该能够投给它。
想法?
你不应该直接从另一个类调用一个演员的方法。 它打破了系统,这是整个设计
- 仅与通信封装演员的具体实施
ActorRef
与呼叫来获得actorOf
或actorFor
- 限制行为者之间的交流,消息传递,使用可用的(
!
, ?
)方法
如果你需要创建一个参考ActorA
到另一个ActorB
,您可以:
- 创建裁判
ActorB
在ActorA
的初始化代码,如图http://doc.akka.io/docs/akka/2.0.3/scala/actors.html - 发送
ActorB
的参考ActorA
作为特定消息。 然后ActorA
可以存储在参考范围内receive
实现
如果您需要调用的方法满足某个接口/特质约束,看看类型化的演员
如果你想创建演员你可以做这个测试时那么做到这一点:
import akka.testkit.TestActorRef
val actorRef = TestActorRef[MyActor]
val actor = actorRef.underlyingActor
然后你可以运行在演员的方法
你可以投什么东西,编译器会很乐意这样做,但如果它不能在运行时检查将失败。 该ActorRef
是不是你的实例Actor
类或它的一个亚型。
当你这样做:
system.actorOf(Props(new nodeActor("node1")), name="node1")
你回来的ActorRef
,以及应只发送短信。 除此之外,当你调用actor立即开始system.actorOf
,所以想呼吁的方法Actor
在启动之前的实例是不可能的。
下面是从演员的描述阿卡文档解释演员的引用。