【发布时间】:2012-10-11 15:06:07
【问题描述】:
使用类型标签,我可以看到某种类型的参数:
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[List[Int]]
res0: reflect.runtime.universe.Type = List[Int]
但我只是不太清楚如何以编程方式以一般方式将“Int”从那里取出。
(我已经在 REPL 中徘徊了一个小时,尝试对 Type 进行排列,看看我能从中获得什么……我得到了很多东西表明这是一个“列表”,但很好找到那个“Int”的运气!而且我真的不想求助于解析 toString() 输出......)
Daniel Sobral 对here 进行了出色的(和往常一样)快速概览,其中他非常接近我正在寻找的内容,但(显然)只有当你碰巧知道,对于那个特定的课程,一些特定的可以查询类型的方法:
scala> res0.member(newTermName("head"))
res1: reflect.runtime.universe.Symbol = method head
scala> res1.typeSignatureIn(res0)
res2: reflect.runtime.universe.Type = => Int
但我希望有更通用的东西,它不涉及在声明的方法列表中查找并希望其中一个能够在某处捕获(并因此泄露)标签的当前类型信息。
如果 Scala 可以如此轻松地打印“List[Int]”,为什么在不借助字符串模式匹配的情况下发现其中的“Int”部分如此困难?还是我只是错过了一些非常非常明显的东西?
scala> res0.typeSymbol.asInstanceOf[ClassSymbol].typeParams
res12: List[reflect.runtime.universe.Symbol] = List(type A)
scala> res12.head.typeSignatureIn(res0)
res13: reflect.runtime.universe.Type =
咕噜……
【问题讨论】:
-
这是一个非答案:至少使用 M7,您可以通过转换为内部 API 来获取类型参数:
typeOf[List[Int]].asInstanceOf[scala.reflect.internal.Types$TypeApiImpl].typeArguments。
标签: scala reflection scala-2.10