我正在使用 Akka 使用 Scala 进行 Actor 模型编程,为了充分充分地使用我的结构的某些特性,我决定使用从 Scala 抽象类到 Akka ActorRef 的隐式转换。它是这样的:
abstract class A {
val actor = system.actorOf(Props(new C),"dummy")
def send(msg: String) = actor ! msg // This compiles fine
}
class C extends akka.actor.Actor {
def receive = {case msg => println(msg)}
}
implicit def AtoC(a: A) = a.actor
然后我这样使用它:
class D extends A
val d = new D
通常,由于转换工作正常,我应该能够通过执行以下操作向 D 中的演员发送消息:
d ! message // This does not compile
但这显然是不允许的,这不是一个大问题,因为我仍然可以使用 tell 方法:
d.tell(message)
我仍然可以使用“!” 通过使用此转换:
implicit def AtoC(a: A) = a.actor.asInstanceOf[ScalaActorRef]
但是,如果我这样做,我将无法使用任何 ActorRef 方法。我可以忍受不能使用“!” 但我想了解为什么转换会导致这种行为,或者我错过了什么?
谢谢!