给出
Any
类型的值TypeTag
如何转换值
不幸的是,以下代码段无法编译
val v: Any = 123
val tag = typeTag[Int]
val i = v.asInstanceOf[t.tpe]
答案 0 :(得分:2)
使用此
import scala.reflect.ClassTag
def getTypedArg[T: ClassTag](any: Any): Option[T] = {
any match {
case t: T => Some(t)
case invalid =>
None
}
}
用法
scala> getTypedArg[Int](5)
res1: Option[Int] = Some(5)
scala> getTypedArg[Int]("str")
res2: Option[Int] = None
来源:Retrieve class-name from ClassTag
EDIT-1
根据@Aki的要求,通过这种技巧,它也可以与TypeTag
s一起使用
import reflect.runtime.universe._
import scala.reflect.ClassTag
def typeToClassTag[T: TypeTag]: ClassTag[T] = {
ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}
def getTypedArg2[T: TypeTag](any: Any): Option[T] = {
implicit val c: ClassTag[T] = typeToClassTag[T]
any match {
case t: T => Some(t)
case invalid =>
None
}
}
答案 1 :(得分:1)
您可以编写自己的方法进行转换。
(请注意,此方法永远不会抛出ClassCastExceptions)
def cast[A](a: Any, tag: TypeTag[A]): A = a.asInstanceOf[A]