使用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)
  }
}

这里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

但样本似乎没有涵盖这种情况,我发现那里的环境,宇宙和镜子的讨论很难穿透。看起来我要做的应该是相当简单的,但也许我完全错了。

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

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)
}

最新更新