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