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

时间:2013-06-09 13:42:37

标签: scala reflection

我正在尝试使用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

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

1 个答案:

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