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

次に、アクターでメソッドを実行できます

于 2012-11-14T16:18:56.650 に答える
6

アクターのメソッドを別のクラスから直接呼び出すことは想定されていません。それはシステムの全体の設計を壊します、それは

  • またはActorRefへの呼び出しで取得したものとのみ通信することにより、アクターの特定の実装をカプセル化します。actorOfactorFor
  • !利用可能な( 、?)メソッドを使用して、アクター間の通信をメッセージパッシングに制限します

ActorA別の参照を作成する必要がある場合は、次のActorBことができます。

  • http://doc.akka.io/docs/akka/2.0.3/scala/actors.htmlActorBに示すように、ActorAの初期化コードでへの参照を作成します
  • ActorBへの参照をActorA特定のメッセージとして送信します。次に、実装ActorA内に参照を保存できますreceive

インターフェイス/特性の制約を満たすためにメソッドを呼び出す必要がある場合は、型付きアクターを確認してください

于 2012-11-08T16:23:13.213 に答える
1

何でも何でもキャストでき、コンパイラーは喜んでそうしますが、それが不可能な場合、実行時のチェックは失敗します。は、クラスActorRefのインスタンスまたはそのサブタイプではありません。Actor

これを行う場合:

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

ActorRefメッセージのみを送信する必要がある が返されます。それとは別に、アクターは を呼び出すとすぐに開始されるため、開始される前にインスタンスsystem.actorOfでメソッドを呼び出そうとすることはできません。Actor

以下は、アクターの参照を説明するAkka Docsのアクターの説明です。

于 2012-11-08T16:27:05.343 に答える