如何将变量转换为某些运行时类型从Scala中的TypeCast获取
发布时间:2020-12-16 09:28:10 所属栏目:安全 来源:网络整理
导读:asInstanceOf [T]适用于“简单”情况,其中类型T由代码明确给出:例如 scala val x: Any = 5x: Any = 5scala x.asInstanceOf[Int]res50: Int = 5scala val m1: Any = Map[String,Int]("a"-1,"b"-2)m1: Any = Map(a - 1,b - 2)scala m.asInstanceOf[Map[String
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) 但是当在运行时通过TypeTags检索类型T时,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不是一种类型.那么reflect.runtime.universe.Type不是真正的类型?如何使用typeTag信息将值转换为特定类型? 解决方法
intT不是类型,而是Type的实例.令人困惑,当然.我不确定反射API中是否有内置功能可以执行此操作,但您可以轻松编写一个方法,在给定元素Any和TypeTag [A]的情况下将其强制转换为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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |