scala - 在 Scala 2.10 中通过反射查找类型参数?

标签 scala reflection scala-2.10

使用类型标签,我能够查看某种类型的参数:

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 = 

咕噜...

最佳答案

Scala 2.11 开始,您只需使用:

yourGenericType.typeArgs.head

请参阅macros changelog点号 14。

关于scala - 在 Scala 2.10 中通过反射查找类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12842729/

相关文章:

scala - 如何在 Scala 的 RddPair<K,Tuple> 中使用 reduceByKey

scala - 调用保存在 map 中的函数

java - 使用 jni4net 传递的两种方式对象(是 : Ignore Missing Class(es))

调用 copy() 时父特性的 Scala Case 类复制成员

scala - 在 scala 的字符串插值中循环

multithreading - 默认情况下,scala 的并行集合使用多少个线程?

scala - Akka 2.1.2 Scheduler有问题(无法识别“系统”)

java - 实例化并应用未知泛型类型的泛型方法 - Java

c# - 在 linq 中动态设置 order by 子句内的键

scala - 为什么 Scala 不推断继承特征的类型成员?