我正在尝试使用Scala 2.10反射来查找方法参数的派生类型。例如,请考虑以下程序:
import reflect.runtime.universe._
object ReflectionTest {
def checkType[A : TypeTag](item: A) {
println("typeOf[A]: " + typeOf[A])
}
def main(args: Array[String]) {
val a = Array(1, "Hello")
for (item <- a) checkType(item)
}
}
此处a
的类型为Array [Any],因此发送到checkType
的每个项都有Any类型。因此,checkType
输出
typeOf[A]: Any
typeOf[A]: Any
这对我来说很有意义,因为TypeTag是由编译器在调用时生成的(其中所有知道类型的都是Any
)。但是,我想要确定每个项目的实际类型。我想输出一些符合
Int
String
我查看了这里的文档
http://docs.scala-lang.org/overviews/reflection/overview.html
但样本似乎没有涵盖这种情况,我发现环境,宇宙和镜子的讨论难以渗透。似乎我想要做的事情应该相当简单,但也许我正在接近它完全错误。
答案 0 :(得分:7)
最明显的解决方案是使用类:
def checkType[A](item: A) {
println("typeOf[A]: " + item.getClass)
}
但是如果你想使用Type
,那么还需要做一些额外的工作:
def checkType[A](item: A) {
val mirror = runtimeMirror(this.getClass.getClassLoader)
println("typeOf[A]: " + mirror.classSymbol(item.getClass).toType)
}