有没有办法可以让下面的代码工作?预期的结果是列表中的一个promise将被完成(具有匹配的String类型的一个)。
import scala.concurrent.Promise
import scala.reflect.ClassTag
case class Test[T](promise: Promise[T], tag: ClassTag[T])
def createTest[T](implicit tag: ClassTag[T]) = Test(Promise[T](), tag)
val seq: Seq[Test[_]] = Seq(createTest[String], createTest[Int])
seq.foreach { case Test(promise, tag) =>
"asd" match {
case tag(s) => promise.success(s)
case _ => // nothing
}
}
目前它产生错误:
发现:s.type(底层类型为Any)
必需:_ $ 1,其中类型_ $ 1
答案 0 :(得分:1)
我找到了使用Class
代替ClassTag
的解决方案:
import scala.concurrent.Promise
case class Test[T](promise: Promise[T], clazz: Class[T])
def createTest[T](clazz: Class[T]) = Test(Promise[T](), clazz)
val seq: Seq[Test[_]] = Seq(createTest[String](classOf[String]), createTest[Int](classOf[Int]))
seq.foreach { case Test(promise, clazz) =>
val obj = "asd"
if (clazz.isInstance(obj)) promise.success(clazz.cast(obj))
}