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

在Scala中,当TypeTag可用时,如何强制转换值,scala,types,Scala,Types,给定 类型为Any 与所需类型相对应的TypeTag 我该如何计算价值呢 不幸的是,以下代码段没有编译 val v: Any = 123 val tag = typeTag[Int] val i = v.asInstanceOf[t.tpe] 用这个 import scala.reflect.ClassTag def getTypedArg[T: ClassTag](any: Any): Option[T] = { any match { ca

给定

  • 类型为
    Any
  • 与所需类型相对应的
    TypeTag
我该如何计算价值呢

不幸的是,以下代码段没有编译

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

import scala.reflect.ClassTag

def getTypedArg[T: ClassTag](any: Any): Option[T] = {
      any match {
        case t: T => Some(t)
        case invalid =>
          None
      }
}

用法


资料来源:


编辑-1

正如所要求的,它也可以使用
TypeTag
s来工作,使用这个hack

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

参考资料:

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


你能举一个你想在哪里做这件事的例子吗?一般来说,完全按照你的要求去做是不可能的。备选方案取决于具体情况。@Jasper-M我问了一个更完整的问题来解释用例,参见:
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
  }
}
def cast[A](a: Any, tag: TypeTag[A]): A = a.asInstanceOf[A]