2016-06-23 2 views
0

私は任意のActorクラスを受け入れ、生成するspawn関数を作成しようとしています。私が持っているものは次のとおりです。クラスタイプのスポンサーアクター?

object entities { 
    val system = ActorSystem("Entities") 

    def spawnEntity(entity : Actor) = { 
     system.actorOf(Props[entity]) 
} 

ここでは、どのようなタイプのエンティティがわかりませんが、わかります。しかし、私もclassOf(entity)entity.classを試しましたが、どちらもうまくいきませんでした。

どのようにこのような俳優を出すことができますか? Desire機能は次のようなものになります。

entities.spawnEntity(Bird) 
entities.spawnEntity(Rabbit(/* params here * /) 

鳥とうさぎは俳優です。

EDIT:バードとウサギをクラスではなくオブジェクトとして考えます。私の間違い。

答えて

2

PropsActorを作成するためにClass又はClassTagを必要とするが、entityは、(コードが現在書かれているように)Actorのインスタンスであると考えられます。あなたはがほしいと思っていますは、署名entity: Class[_ <: Actor]です。

または、あなたはspawnEntityの実装で使用しようとしているものである、代わりに型パラメータを使用することができます。

import scala.reflect.ClassTag 

def spawnEntity[Entity <: Actor: ClassTag] = system.actorOf(Props[Entity]) 

spawnEntityClassTag[Entity]は、コンパイラによって生成することができるActorの(上記有界または同じタイプ)のサブタイプでなければならないEntityと呼ばれる一種のパラメータとパラメータのない方法です。

使用法:それはインスタンスではなくクラスであるため

entities.spawnEntity[Bird] 

Rabbit(/* params here * /)のようなものを使用して、しかし動作しません。

+0

きちんとしています!私は間違ったことを聞いていたと思う。エンティティがクラスではなくオブジェクトであるとしましょう。それでは、どうしたらいいですか?使用法は、entities.spawnEntity(Bird)です。理想的には、引数も渡すことができます。新しい理解を反映するために私の質問を編集します。 – Stradigos

関連する問題