如何将变量转换为从 Scala 中的 TypeCast 获取的特定运行时类型
How to cast a variable to certain runtime type got from TypeCast in Scala
asInstanceOf[T]
适用于 "simple" 类型 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
不是 type
。所以 reflect.runtime.universe.Type
不是真正的 type
?如何使用 typeTag
信息将值转换为特定类型?
intT
不是类型,而是 Type
的实例。令人困惑,当然。我不确定反射 API 中是否有内置的东西可以做到这一点,但是您可以轻松地编写一个方法,在给定元素 Any
和 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
使用隐式 class 的另一个变体:
implicit class TypeTagCast(a: Any) {
def fromTypeTag[A](tt: TypeTag[A]): A = a.asInstanceOf[A]
}
scala> a.fromTypeTag(intT)
res106: Int = 1
asInstanceOf[T]
适用于 "simple" 类型 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
不是 type
。所以 reflect.runtime.universe.Type
不是真正的 type
?如何使用 typeTag
信息将值转换为特定类型?
intT
不是类型,而是 Type
的实例。令人困惑,当然。我不确定反射 API 中是否有内置的东西可以做到这一点,但是您可以轻松地编写一个方法,在给定元素 Any
和 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
使用隐式 class 的另一个变体:
implicit class TypeTagCast(a: Any) {
def fromTypeTag[A](tt: TypeTag[A]): A = a.asInstanceOf[A]
}
scala> a.fromTypeTag(intT)
res106: Int = 1