在Scala中,如何在TypeTag可用时强制转换值

时间:2018-12-21 14:13:47

标签: scala types

给出

  • Any类型的值
  • 与所需类型相对应的TypeTag

如何转换值

不幸的是,以下代码段无法编译

val v: Any = 123
val tag    = typeTag[Int]
val i      = v.asInstanceOf[t.tpe]

2 个答案:

答案 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
  }
}

参考:How to get ClassTag form TypeTag, or both at same time?

答案 1 :(得分:1)

您可以编写自己的方法进行转换。
(请注意,此方法永远不会抛出ClassCastExceptions)

def cast[A](a: Any, tag: TypeTag[A]): A = a.asInstanceOf[A]