没有ClassTag可用于T - 不适用于阵列

时间:2013-09-09 05:59:03

标签: scala

以下是涉及akka的代码的一部分:

abstract class AkkaBaseClass[T <: AkkaClass1, U <: Loger] extends Actor {

  protected val val1 = context.actorOf(Props[T])
  protected val val2 = context.actorOf(Props[U])

  def receive = {
    case "test" => {
      implicit val timeout = Timeout(Config.timeout seconds)
      val future = val1 ? "request"
      val result = Await.result(future, timeout.duration).asInstanceOf[List[ActorRef]]
      sender ! result
    }


    case "log" => val2 ! "log"
  }

class AkkaClass1 extends Actor { .... }


trait Loger extends Actor { ..... }

有2个错误:

No ClassTag available for T and No ClassTag available for U

TU不是数组。我该怎么办?

2 个答案:

答案 0 :(得分:8)

虽然您省略了发生错误的地方,但我猜它们正在Props发生。可能是Props采用隐式ClassTag作为参数的情况,特别是因为它不接受任何其他参数。虽然数组创建使用ClassTag,但它也可以用于其他事情,例如获取Class然后可以通过反射实例化类,或者在比较实例时作为参考接收。

要解决此问题,请按以下方式声明AkkaBaseClass

import scala.reflect.ClassTag

abstract class AkkaBaseClass[T <: AkkaClass1 : ClassTag, U <: Loger : ClassTag] extends Actor {

答案 1 :(得分:3)

如果不是必需,请不要阻止期货

这是解决问题的方法。

abstract class AkkaBaseClass[T <: AkkaClass1 : ClassTag, U <: Loger : ClassTag] extends Actor {

  protected val val1 = context.actorOf(Props[T])
  protected val val2 = context.actorOf(Props[U])

  def receive = {
    case "test" => val1 forward "request"
    case  "log" => val2 ! "log"
  }

class AkkaClass1 extends Actor { .... }


trait Loger extends Actor { ..... }