Създаване на общ подклас на актьор, който също приема параметър на конструктора

Имам следния код, където T е подклас на актьор, който също трябва да приема аргумент на конструктор:

abstract class AbstractActor(dest: ActorRef) extends Actor {
  //...
}

class ChildActor(dest: ActorRef) extends AbstractActor(dest) {
  //...
}

class ParentActor[T <: AbstractActor : ClassTag] extends Actor {
  val childRef = context.actorOf(Props(classOf[T], destActorRef))
  //...
}

Компилаторът дава грешка: "необходим е тип клас, но е намерен T". Предполагам, че проблемът е, че човек може също да дефинира childActor без параметъра на конструктора:

class ChildActor extends AbstractActor(dest) {
  //...
}

И така, опитах:

class ParentActor[T <: AbstractActor : ClassTag] extends Actor {

  def createT(dest: ActorRef)(implicit ev: Manifest[T]): ActorRef =
    context.actorOf(Props(ev.runtimeClass, dest))

  val childRef = createT(destActorRef)
  //...
}

Но тогава получавам: „няма наличен манифест за T“. Някакви идеи какво правя грешно? Благодаря ти


person Lasf    schedule 07.07.2014    source източник
comment
За липсата на наличен манифест за T част, тази тема може да бъде полезна: stackoverflow.com/questions/7294761/   -  person Sudheer Aedama    schedule 08.07.2014


Отговори (1)


При първия опит вашият код е неуспешен поради classOf[T]. classOf трябва да получи явен клас, той не може да работи с параметър тип, дори ако има ClassTag.

При втория опит изисквате ClassTag за тип T, но след това createT изисква Manifest. Manifest е подтип на ClassTag и наличното ClassTag не може безопасно да бъде преобразувано към Manifest. Все пак сте близо, променете изискването на [T <: AbstractActor : Manifest] и вашият код трябва да работи.

person wingedsubmariner    schedule 07.07.2014
comment
Като се има предвид, че Manifest очевидно изчезва в някакъв момент в бъдещето, виждате ли някакви клопки при замяната му с ClassTag? Така че ще имаме (implicit tag: ClassTag[T]) и след това Props(tag.runtimeClass, dest) вместо това - person Lasf; 08.07.2014
comment
Изглежда, че преместването в ClassTag е правилният избор. - person wingedsubmariner; 08.07.2014