私は Scala でのアクター モデル プログラミングに Akka を使用しています。私の構造の一部の機能を完全かつ十分に使用するために、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 メソッドを使用できなくなります。「!」が使えなくても生きていける。しかし、変換がそのような動作を引き起こす理由を理解したいのですか、それとも何か不足していますか?
ありがとうございました!