使用Scala反射查找大多数派生的运行时类型

Pet*_*pin 3 reflection scala

我正在尝试使用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)
  }
}
Run Code Online (Sandbox Code Playgroud)

这里a有类型Array [Any]所以每个被发送的项目checkType都有Any类型.结果,checkType产出

typeOf[A]: Any
typeOf[A]: Any
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,因为TypeTag是由编译器在调用时生成的(其中所有知道类型的都是它Any).但是,我想要确定每个项目的实际类型.我想输出一些东西

Int
String
Run Code Online (Sandbox Code Playgroud)

我在这里查看了文档

http://docs.scala-lang.org/overviews/reflection/overview.html

但是样本似乎并没有涵盖这种情况,我发现环境,宇宙和镜子的讨论难以渗透.似乎我想要做的事情应该相当简单,但也许我正在接近它完全错误.

ten*_*shi 7

最明显的解决方案是使用该类:

def checkType[A](item: A) {
  println("typeOf[A]: " + item.getClass)
}
Run Code Online (Sandbox Code Playgroud)

但是如果你想合作Type,那么还需要做一些额外的工作:

def checkType[A](item: A) {
  val mirror = runtimeMirror(this.getClass.getClassLoader)
  println("typeOf[A]: " + mirror.classSymbol(item.getClass).toType)
}
Run Code Online (Sandbox Code Playgroud)