将ClassTag与案例类中的另一个字段进行匹配

时间:2017-11-01 00:18:46

标签: scala reflection

有没有办法可以让下面的代码工作?预期的结果是列表中的一个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

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))  
}