繁体   English   中英

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

[英]In Scala, how to cast a value when a TypeTag is available

特定

  • 类型为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
      }
}

用法

scala> getTypedArg[Int](5)
res1: Option[Int] = Some(5)

scala> getTypedArg[Int]("str")
res2: Option[Int] = None

来源: 从ClassTag中检索类名


编辑-1

正如@Aki所要求的那样 ,也可以通过这种黑客攻击TypeTag

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

参考: 如何同时获取ClassTag表单TypeTag或两者?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM