Как получить параметры типа для Reflect.runtime.universe.Type в scala?

Предположим, я получаю Type, представляющий 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

person user48956    schedule 09.01.2015    source источник


Ответы (2)


Скала 2.11

Вам нужен rt.typeArgs, который возвращает список типов (в вашем случае он содержит один элемент: Int).

Скала 2.10

val args = returnType match {
  case r: universe.TypeRefApi => r.args
  case _ => List()
}
person David Frank    schedule 09.01.2015
comment
Universe.Type не имеет метода typeArgs — это метод TypeSymbol. Когда я пытаюсь получить typeSymbol, дженерики стираются. - person user48956; 09.01.2015
comment
В Scala 2.11.4 это точно есть. Какую версию вы используете? - person David Frank; 09.01.2015

Переполнение стека содержит ответ для 2.10 здесь: ввести параметры через отражение в Scala 2.10?

rt.asInstanceOf[TypeRefApi].args

. . . . . .

person user48956    schedule 09.01.2015