我有一个演员定义如此:
class nodeActor(ID: String) extends Actor
Run Code Online (Sandbox Code Playgroud)
它包含一个方法,用于在actor启动之前设置它:
def addRef(actor:ActorRef)
Run Code Online (Sandbox Code Playgroud)
我将这个actor实例化为:
val node1 = system.actorOf(Props(new nodeActor("node1")), name="node1")
Run Code Online (Sandbox Code Playgroud)
它返回一个ActorRef.编译器不允许我在ActorRef上调用"addRef",因为它是子类型的成员.所以我使用以下方式投射节点:
node1.asInstanceOf[nodeActor].addRef(link1)
Run Code Online (Sandbox Code Playgroud)
这让编译器感到高兴.然后在运行时我得到
java.lang.ClassCastException: akka.actor.LocalActorRef cannot be cast to ActorStressTest.nodeActor
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎没有意义,因为它是一个子类型,我应该能够投射它.
想法?
小智 7
如果你想做这个测试,那么在创建actor时你可以这样做:
import akka.testkit.TestActorRef
val actorRef = TestActorRef[MyActor]
val actor = actorRef.underlyingActor
Run Code Online (Sandbox Code Playgroud)
然后你可以在actor上运行方法
你不应该直接从另一个类调用actor的方法.它破坏了系统的整体设计
ActorRef通过调用actorOf或获得的获得通信来封装actor的特定实现actorFor!,?)方法限制actor与消息传递之间的通信如果您需要在ActorA另一个中创建引用,ActorB您可以:
ActorB在ActorA的初始化代码,如图http://doc.akka.io/docs/akka/2.0.3/scala/actors.htmlActorB引用ActorA作为特定消息发送.然后ActorA可以在receive实现中存储引用如果需要调用方法来满足Interface/Trait约束,请查看Typed Actors