在Scala 2.10中通过reflection查找types参数?

使用types标签,我可以看到某些types的参数:

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上进行排列,看看我能从中得到什么……我得到了很多东西,表明这是一个“列表”,但是find了好运那“Int”!我真的不想诉诸parsingtoString()输出…)

丹尼尔·索布拉尔(Daniel Sobral) 在这里有一个很好的(像往常一样的)快速概览,他在这里非常接近我正在寻找的东西,但是(显然)只有当你碰巧知道,对于那个特定的类,一些特定的方法,询问:

 scala> res0.member(newTermName("head")) res1: reflect.runtime.universe.Symbol = method head scala> res1.typeSignatureIn(res0) res2: reflect.runtime.universe.Type = => Int 

但是我希望有一些更一般的东西,它不涉及在已声明的方法列表中生根,并希望其中一个将捕获标签的当前types信息(并因此泄露)。

如果Scala可以轻松地打印 “List [Int]”,那么为什么要发现这个“Int”部分是如此的困难 – 而不是采用string模式匹配呢? 还是我错过了一些真的,真的很明显?

 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 = 

格儿…

可悲的是,我不认为有一种方法可以给你参数,但是你可以通过这种方式来获得它们:

 Welcome to Scala version 2.10.0-20121007-145615-65a321c63e (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35). Type in expressions to have them evaluated. Type :help for more information. scala> import scala.reflect.runtime.universe._ import scala.reflect.runtime.universe._ scala> typeOf[List[Int]] res0: reflect.runtime.universe.Type = scala.List[Int] scala> res0 match { case TypeRef(_, _, args) => args } res1: List[reflect.runtime.universe.Type] = List(Int) scala> res1.head res2: reflect.runtime.universe.Type = Int 

编辑这里有一个稍微好一点的方法来实现同样的事情( 关于scala-internals的讨论 ):

 scala> res0.asInstanceOf[TypeRefApi].args res1: List[reflect.runtime.universe.Type] = List(Int) 

使用Scala 2.11 (当OP提出这个问题时肯定不可用),你可以简单地使用:

 yourGenericType.typeArgs.head 

请参阅macros更新logging点编号14。