3

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

但是样本似乎没有涵盖这种情况,我发现那里对环境、宇宙和镜子的讨论很难理解。看起来我正在尝试做的事情应该相当简单,但也许我完全错误地接近它。

4

1 回答 1

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)
}
于 2013-06-09T13:56:24.000 回答