2012-09-06 1 views
0

저는 Akka를 스칼라로 액터 모델 프로그래밍에 사용하고 있으며, 제 구조의 일부 기능을 완벽하고 충분히 사용하기 위해 Scala 추상 클래스에서 Akka ActorRef 로의 암시 적 변환을 사용하기로 결정했습니다. 그것은 이런 식입니다 :Akka ActorRef에 대한 스칼라 암시 적 변환은 Akka의 send 연산자 "!"에 대한 액세스를 차단합니다. 왜 그런가?

다음
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 

그러나 그것은 분명히 허용하지 않는다을, 이것은 내가 아직도 텔 방법을 사용할 수 있기 때문에 큰 문제가되지 않습니다

d.tell(message) 

"!" 이 전환을 대신 사용하여 :

implicit def AtoC(a: A) = a.actor.asInstanceOf[ScalaActorRef] 

그러나이 작업을 수행하면 ActorRef 메서드를 사용할 수 없습니다. 나는 "!"을 사용할 수 없게 살 수있다. 그러나 왜 전환이 그러한 행동을 일으키는 지 이해하고 싶습니다. 그렇지 않으면 무엇인가 놓치고 있습니까?

감사합니다.

답변

2

스칼라가 여러 암시 적 변환을 수행하지 않기 때문에. ! ActorRef에서 ScalaActorRef 로의 암시 적 변환입니다 (Java API에서 기호 메서드를 숨기기 위해).

/** 
* This trait represents the Scala Actor API 
* There are implicit conversions in ../actor/Implicits.scala 
* from ActorRef -> ScalaActorRef and back 
*/ 
trait ScalaActorRef { ref: ActorRef ⇒ 

    /** 
    * Sends a one-way asynchronous message. E.g. fire-and-forget semantics. 
    * <p/> 
    * 
    * If invoked from within an actor then the actor reference is implicitly passed on as the implicit 'sender' argument. 
    * <p/> 
    * 
    * This actor 'sender' reference is then available in the receiving actor in the 'sender' member variable, 
    * if invoked from within an Actor. If not then no sender is available. 
    * <pre> 
    * actor ! message 
    * </pre> 
    * <p/> 
    */ 
    def !(message: Any)(implicit sender: ActorRef = null): Unit 

}