I have a an actor defined as so:
class nodeActor(ID: String) extends Actor
which contains a method, which is used to set up the actor before it is started:
def addRef(actor:ActorRef)
I instantiate this actor as so:
val node1 = system.actorOf(Props(new nodeActor("node1")), name="node1")
which returns me an ActorRef. The compiler doesn't let me call "addRef" on an ActorRef since it's a member of the subtype. So I cast the node using:
node1.asInstanceOf[nodeActor].addRef(link1)
Which keeps the compiler happy. Then at runtime I get
java.lang.ClassCastException: akka.actor.LocalActorRef cannot be cast to ActorStressTest.nodeActor
which doesn't even seem to make sense to me since it's a subtype and I should be able to cast to it.
Ideas?
You're not supposed to call an actor's methods directly from another class. It breaks the whole design of the system, which is
ActorRef
obtained with the call toactorOf
oractorFor
!
,?
) methodsIf you need to create a reference in
ActorA
to anotherActorB
you can:ActorB
in theActorA
's initialization code as shown in http://doc.akka.io/docs/akka/2.0.3/scala/actors.htmlActorB
's reference to theActorA
as a specific message. ThenActorA
can store the reference withinreceive
implementationIf you need to call a method to satisfy an Interface/Trait constraint, have a look at Typed Actors
If you want to do this for testing then when creating actor you can just do this:
Then you can run methods on actor
You can cast anything to anything and the compiler will happily do so, but the check at runtime will fail if it's not possible. The
ActorRef
is not an instance of yourActor
class or a subtype of it.When you do this:
You get back an
ActorRef
to which you should only send messages. Apart from that, the actor is started immediately when you callsystem.actorOf
, so trying to call a method on theActor
instance before it is started is not possible.Here is a description of actors from the Akka Docs explaining actor references.