我有一个演员定义如此:
class nodeActor(ID: String) extends Actor
包含一个方法,用于在actor启动之前设置它:
def addRef(actor:ActorRef)
我将这个actor实例化为:
val node1 = system.actorOf(Props(new nodeActor("node1")), name="node1")
给我一个ActorRef。编译器不允许我在ActorRef上调用“addRef”,因为它是子类型的成员。所以我使用:
来强制转换节点node1.asInstanceOf[nodeActor].addRef(link1)
让编译器满意。然后在运行时我得到
java.lang.ClassCastException: akka.actor.LocalActorRef cannot be cast to ActorStressTest.nodeActor
这对我来说似乎没有意义,因为它是一个子类型,我应该能够投射它。
想法?
答案 0 :(得分:7)
如果您想要进行测试,那么在创建actor时您可以这样做:
import akka.testkit.TestActorRef
val actorRef = TestActorRef[MyActor]
val actor = actorRef.underlyingActor
然后你可以在actor上运行方法
答案 1 :(得分:6)
你不应该直接从另一个类调用actor的方法。它打破了整个系统的设计,即
ActorRef
或actorOf
actorFor
进行通信来封装演员的具体实现
!
,?
)方法限制actor与消息传递之间的通信如果您需要在ActorA
中创建与另一个ActorB
的引用,您可以:
ActorB
的初始化代码中创建参考ActorA
,如http://doc.akka.io/docs/akka/2.0.3/scala/actors.html ActorB
的{{1}}引用作为特定消息发送。然后ActorA
可以在ActorA
实施如果您需要调用方法来满足Interface / Trait约束,请查看Typed Actors
答案 2 :(得分:1)
您可以将任何内容转换为任何内容,编译器也会很乐意这样做,但如果不可能,运行时检查将失败。 ActorRef
不是您的Actor
类的实例或其子类型。
执行此操作时:
system.actorOf(Props(new nodeActor("node1")), name="node1")
您将返回ActorRef
,您应该只向其发送消息。除此之外,当您调用system.actorOf
时,actor立即启动,因此尝试在Actor
实例启动之前调用方法是不可能的。
以下是Akka Docs解释演员引用的演员的描述。