【发布时间】:2012-11-08 14:50:46
【问题描述】:
我有一个这样定义的演员:
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
这对我来说似乎没有意义,因为它是一个子类型,我应该能够转换为它。
想法?
【问题讨论】:
-
请通过发送消息而不是直接方法调用与actor通信。那些实现 Actor 的人努力将真实的 Actor 实例隐藏在 ActorReferences 后面。这是一种不同的编程模型。习惯就好。
-
一般来说“它是一个子类型..我应该能够转换成它”是一个危险的断言。当且仅当所指对象符合该子类型时,您才可以转换对子类型的引用,这通常不是正确的,并且在您的情况下显然不是正确的。
-
嗨@Alex,我衷心建议您在进一步冒险之前仔细阅读documentation。它可能会帮助您避免许多陷阱和许多无意义的工作。真诚的。
-
“它是一个子类型..我应该能够转换成它” - 这甚至不是真的:
node1是一个ActorRef,它的作用就像一个指向实际 Actor 实例的指针。您的nodeActor实例隐藏在 Akka 系统中,并不意味着直接与之交互。 -
@Dylan 好的,这似乎是我的问题所在。我认为一个 ActorRef,因为它是由构造函数类型返回的,所以它是实际的 actor 对象,而不仅仅是指向系统的指针。现在说得通了。