scala - 如何在scala中获取reflect.runtime.universe.Type的类型参数?

标签 scala scala-collections scala-reflect

假设我得到一个代表 List[Int] 的类型:

> import scala.reflect.runtime.universe
> val mirror = universe.runtimeMirror(this.getClass.getClassLoader)
mirror: reflect.runtime.universe.Mirror = JavaMirror with ...

> class X{ def getList():List[Int] = null  }
defined class X

> val method = mirror.
    classSymbol(classOf[X]).
    toType.
    declarations.
    filter{_.isMethod}.
    map{_.asInstanceOf[universe.MethodSymbol]}.
    filter{ m => m.
    name.
    toString()=="getList" }.
    head   
method: reflect.runtime.universe.MethodSymbol = method getList

> val rt = method.returnType
rt: reflect.runtime.universe.Type = scala.List[scala.Int]

如何从reflect.runtime.universe.Type(显然知道类型参数scala.Int)到实际类型参数?

我看到 TypeSymbol 有一个参数

一些实验..

rt.typeSymbol  // reflect.runtime.universe.Symbol = class List ... Int is erased
rt.typeSymbol.asInstanceOf[TypeSymbol].typeParams // List[reflect.runtime.universe.Symbol] = List(type A)
rt.takesTypeArgs  // false !!
rt.termSymbol  //None
rt.typeSymbol.typeSignature // Much, talk about generics, but no Int
rt.typeSymbol.asInstanceOf[TypeSymbol].typeParams  // List[reflect.runtime.universe.Symbol] = List(type A)
rt.getClass  // Class[_ <: reflect.runtime.universe.Type] = class scala.reflect.internal.Types$TypeRef$$anon$1
rt.asInstanceOf[TypeRef].sym  // List

最佳答案

斯卡拉2.11

您需要rt.typeArgs,它返回类型列表(在您的情况下,它包含单个元素:Int)。

斯卡拉2.10

val args = returnType match {
  case r: universe.TypeRefApi => r.args
  case _ => List()
}

关于scala - 如何在scala中获取reflect.runtime.universe.Type的类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27852247/

相关文章:

json - 非隐式写入无法处理 Option(Scala、JSON、Play 2.3.6)

scala - 从 scala 读取 Avro 文件

Java readInt 方法返回 Scala 中 Int 的 LittleEndian 而不是 BigEndian 值

Scala:我有一个 Set[X] 和函数 (X) => Future[Y] 并想输出一个 Future[Map[X, Y]]

scala - 了解 Stream scala 交错转换行为

scala - 如何在 Scala 宏中获取更高级类型参数的树

用于 Play 的 Json "Validate"

Scala:为案例类动态生成匹配子句

java - 如何在scala中动态输入cast Any?

斯卡拉 SortedMap : Get all keys greater than a given key