10

我有一个这样定义的演员:

class nodeActor(ID: String) extends Actor

其中包含一个方法,用于在启动之前设置参与者:

def addRef(actor:ActorRef)

我这样实例化这个演员:

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

这对我来说似乎没有意义,因为它是一个子类型,我应该能够转换它。

想法?

4

3 回答 3

7

如果您想这样做以进行测试,那么在创建演员时,您可以这样做:

import akka.testkit.TestActorRef
val actorRef = TestActorRef[MyActor]
val actor = actorRef.underlyingActor

然后你可以在actor上运行方法

于 2012-11-14T16:18:56.650 回答
6

你不应该直接从另一个类调用演员的方法。它打破了系统的整体设计,即

  • 通过仅与ActorRef通过调用actorOfactorFor
  • 使用可用的 ( !, ?) 方法将参与者之间的通信限制为消息传递

如果您需要创建ActorA对另一个的引用,ActorB您可以:

如果您需要调用方法来满足接口/特征约束,请查看Typed Actors

于 2012-11-08T16:23:13.213 回答
1

您可以将任何内容强制转换为任何内容,编译器会很乐意这样做,但如果不可能,运行时的检查将失败。ActorRef不是您的类的实例或Actor它的子类型。

当你这样做时:

system.actorOf(Props(new nodeActor("node1")), name="node1")

您会返回一个ActorRef您应该只向其发送消息的地方。除此之外,当您调用 时,actor 会立即启动system.actorOf,因此在实例启动之前尝试调用实例上的方法Actor是不可能的。

这是来自Akka Docs的 Actor 描述,解释了 Actor 引用。

于 2012-11-08T16:27:05.343 回答