以下是涉及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
但T
和U
不是数组。我该怎么办?
答案 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 { ..... }