如何将变量转换为从 Scala 中的 TypeCast 获得的特定运行时类型

2023-11-21

The asInstanceOf[T]适用于类型的“简单”情况T由代码明确给出:例如

scala> val x: Any = 5
x: Any = 5

scala> x.asInstanceOf[Int]
res50: Int = 5

scala> val m1: Any = Map[String, Int]("a"->1, "b"->2)
m1: Any = Map(a -> 1, b -> 2)

scala> m.asInstanceOf[Map[String, Int]]
res51: Map[String,Int] = Map(a -> 1, 2 -> b)

scala> val m2: Any = Map[Any,Any]("a"->1, 2->"b")
m2: Any = Map(a -> 1, 2 -> b)

scala> m.asInstanceOf[Map[Any, Any]]
res52: Map[Any,Any] = Map(a -> 1, 2 -> b)

但是当类型T在运行时通过检索TypeTags, asInstanceOf[T]不起作用。例如:

scala> val intT = typeTag[Int].tpe
intT: reflect.runtime.universe.Type = Int

scala> x.asInstanceOf[intT]
<console>:12: error: not found: type intT
              x.asInstanceOf[intT]

该错误清楚地表明intT不是一个type. So reflect.runtime.universe.Type不是真实的type?如何使用将值转换为特定类型typeTag信息?


intT不是一个类型,而是一个实例Type。当然,令人困惑。我不确定反射 API 中是否内置了某些东西可以执行此操作,但您可以轻松编写一个方法来转换为A给定一个元素Any and a TypeTag[A].

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

scala> val intT = typeTag[Int]
intT: reflect.runtime.universe.TypeTag[Int] = TypeTag[Int]

scala> val a: Any = 1
a: Any = 1

scala> cast(a, intT)
res101: Int = 1

使用隐式类的另一种变体:

implicit class TypeTagCast(a: Any) {
    def fromTypeTag[A](tt: TypeTag[A]): A = a.asInstanceOf[A]
 }

scala> a.fromTypeTag(intT)
res106: Int = 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将变量转换为从 Scala 中的 TypeCast 获得的特定运行时类型 的相关文章

随机推荐