我正在尝试使用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
但是样本似乎并没有涵盖这种情况,我发现环境,宇宙和镜子的讨论难以渗透.似乎我想要做的事情应该相当简单,但也许我正在接近它完全错误.
最明显的解决方案是使用该类:
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)
| 归档时间: |
|
| 查看次数: |
599 次 |
| 最近记录: |