通过使用类型标签,我能够看到某些类型的参数:
scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> typeOf[List[Int]]
res0: reflect.runtime.universe.Type = List[Int]
但是我无法找到一种通用的程序化方法来获取那个" Int "。 (我已经在REPL中徘徊了一个小时,尝试对类型进行排列组合,看看能从中获得什么...我得到了许多指示这是一个“列表”,但祝您好运找到那个“Int”!而且我不想采用解析toString()输出的方法...)Daniel Sobral在这里提供了一个出色的(像往常一样)快速概述,他非常接近我所寻找的东西,但只有在您知道该特定类的某些特定方法可以被询问的情况下才能实现。
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 =
咕噜...
typeOf [List [Int]] .asInstanceOf [scala.reflect.internal.Types $ TypeApiImpl] .typeArguments
。 - Travis Brown