gpt4 book ai didi

scala - 使用 Scala 2.10 反射的类型参数的运行时解析

转载 作者:行者123 更新时间:2023-12-04 12:10:56 26 4
gpt4 key购买 nike

给定类型声明,我能够解析类型参数。

scala> reflect.runtime.universe.typeOf[List[Int]] match {case x:TypeRef => x.args}
res10: List[reflect.runtime.universe.Type] = List(Int)

对于运行时值,相同的方法不起作用。
scala> reflect.runtime.currentMirror.reflect(List(42)).symbol.toType match {case x:TypeRef => x.args}
res11: List[reflect.runtime.universe.Type] = List(B)

有没有办法克服反射值的类型删除?

最佳答案

一个基于阅读TypeTag知识的例子
Scala: What is a TypeTag and how do I use it?
发布者
Eugene Burmako在对您的问题的评论中:

import scala.reflect.runtime.universe._

object ScalaApplication {
def main(args: Array[String]) {
printType(List(42))
printType(List("42"))
printType(List("42", 42))
}

def printType[T : TypeTag](t: T) {
println(typeOf[T])
}
}

这应该给出输出:
$ scala ScalaApplication.scala 
List[Int]
List[String]
List[Any]

[更新 1:]

但是,如果您想知道分配给类型 Any 的引用的类型。您可能必须选择某种类型感知包装器:
import scala.reflect.runtime.universe._

object ScalaApplication {
def main(args: Array[String]) {
val anyWrapper = new AnyWrapper

List(1,2,3).foreach { i =>
i match {
case 1 => anyWrapper.any = 42
case 2 => anyWrapper.any = "a string"
case 3 => anyWrapper.any = true
}
print(anyWrapper.any)
print(" has type ")
println(anyWrapper.typeOfAny)
}
}

class AnyWrapper {
private var _any: Any = null
private var _typeOfAny: Type = null

def any = _any
def typeOfAny = _typeOfAny
def any_=[T: TypeTag](a: T) = {
_typeOfAny = typeOf[T]
_any = a
}

}
}

这应该给出输出:
$ scala ScalaApplication.scala 
42 has type Int
a string has type String
true has type Boolean

但是这个解决方案仍然没有涵盖在编译时引用类型未知的情况。

[更新 2:]

如果类型被显式转换为类型 Any 的引用,您可能必须在 match 语句中枚举所有可能的类型才能恢复类型:
import scala.reflect.runtime.universe._

object ScalaApplication {
def main(args: Array[String]) {

List(1,2,3).foreach { i =>
val any: Any = i match {
case 1 => 42.asInstanceOf[Any]
case 2 => "a string".asInstanceOf[Any]
case 3 => true.asInstanceOf[Any]
}
print(any)
print(" has type ")
println(matchType(any))
}
}

def matchType(any: Any) = {
any match {
case a: Int => typeOf[Int]
case a: String => typeOf[String]
case a: Boolean => typeOf[Boolean]
}
}
}

这应该给出输出:
$ scala ScalaApplication.scala
42 has type Int
a string has type String
true has type Boolean

但是此解决方案要求您知道(并列出)您可以在 any 中收到的所有可能类型。值(value)。

关于scala - 使用 Scala 2.10 反射的类型参数的运行时解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12458502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com