2013-12-11 3 views
1

мне нужно создать актер, в зависимости от параметров командной строки:Создать/получить тип класса динамически

def main(args: Array[String]): Unit = { 
    val t = args(0) match { 
    // 1 
    case 1 => // MyActor1 
    case 2 => // MyActor2 
    case 3 => // MyActor3 
    } 

    // 2 
    val app = system actorOf (Props[/* ??? MyActor1(2,3).type? - not working*/], "app") 
    app ! "Start" 
} 

abstract class MyActorBase extends Actor {...} 
class MyActor1 extends MyActorBase {...} 
class MyActor2 extends MyActorBase {...} 
class MyActor3 extends MyActorBase {...} 

Так у меня есть 2 вопроса: что должно быть возвращено на match и что я должен пройти, чтобы Props?

В C# Я хотел бы использовать typeof оператора, однако, следующий код не работает в Scala MyActor1.type

+0

Исследуемый основной вопрос невозможно. 'Props [X]' - это то, что оценивается в _compile time_. Во время выполнения этого не существует (он был заменен результатом оценки), поэтому его невозможно выполнить динамически. –

ответ

4

только вопрос правильных ключевых слов (здесь я предполагаю, что вы используете latest version of Props api):

val actorClass = args(0) match { 
    case 1 => classOf[MyActor1] 
    case 2 => classOf[MyActor2] 
} 
val app = system actorOf (Props(actorClass), "app") 
+0

Если я скажу: 'val actorClass: Class [MyActorBase] = args (0) ...' тогда он говорит «несоответствие типа». Интересно, почему? –

+0

Но класс [_ <: MyActorBase] работает. Интересно, почему? –

+1

@Alex 'Class' - это класс Java и, следовательно, инвариант. Будучи инвариантным, означает, что 'Class [A] <: Class [B]' истинно, только если 'A' и' B' являются одним и тем же типом. Во всех остальных случаях, включая 'A <: B' (но разные), это отношение неверно. –

Смежные вопросы