2017-02-16 1 views
0

Comment définir une fonction enveloppe/classe addActorToSystem() pourScala système Akka wrapper actorRef

trait Stage extends Actor 
class Stage1(i:Int) extends Stage 
class Stage2(i:Int) extends Stage 

et

implicit val system = ActorSystem("mySystem") 

au lieu de l'appel à

system.actorOf(Props(new Stage1(123)), "myStage1") 

ci-dessous ne fonctionne pas

Vous ne pouvez pas créer une instance de [Stage2] en utilisant explicitement le constructeur (nouveau)

def addActorToSystem(act: Stage, i: Int)(name: String)(implicit sys: ActorSystem) = { 
    sys.actorOf(Props(act(i)), name) 
} 
+0

Est-ce que votre '' Stage1' et Stage2' remplacer les 'Actor # receive' méthode quelque part? –

Répondre

1

Peut-être quelque chose comme ça pourrait vous aider:

def addActorToSystem[T <: Stage](act: Class[T], i: Int)(name: String)(implicit sys: ActorSystem) = { 
    sys.actorOf(Props(act, i), name) 
} 

et l'utilisation comme suit :

val s1 = addActorToSystem(classOf[Stage1], 1)("s1") 
val s2 = addActorToSystem(classOf[Stage2], 2)("s2") 

La création d'un acteur sans ActorContext défini (à l'aide du constructeur) n'est pas autorisée.

La seule raison pour laquelle cela fonctionne dans Props est le fait que l'invocation du constructeur est traitée comme par nom paramètre ainsi son évaluation est deffered