加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何将变量转换为某些运行时类型从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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读