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

标签 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 {
        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的要求,通过这个 hack,它也可以与 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
  }
}

引用:How to get ClassTag form TypeTag, or both at same time?

关于scala - 在 Scala 中,当 TypeTag 可用时如何转换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886227/

相关文章:

sql-server - 返回值的 T-SQL 和 CLR 类型不匹配

scala - Typesafe配置: How to iterate over configuration items

scala - 任意类型A的函数组合

scala - 在 http4s 中发送 JSON 响应的正确方法是什么?

scala - 是否有 Scala DSL 的书籍或在线教程?

rust - 预期类型参数,发现不透明类型

database - Liquibase 数据类型映射文档

types - 在 Rust 的 32 位机器中,f64 类型是如何表示的?

Objective-C 类型推断

scala - Spark 并行处理列