El uso de etiquetas de tipo, yo soy capaz de ver los parámetros de algún tipo:¿Encontrar parámetros de tipo por reflejo en 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]
Pero simplemente no puedo encontrar la manera de obtener mediante programación que "Int" fuera de allí, en una manera general
(He estado deambulando por REPL durante una hora, probando permutaciones en Type, para ver qué puedo obtener de él ... Recibo muchas cosas que indican que esto es una "Lista", pero ¡buena suerte al encontrar ese "Int"! Y realmente no quiero recurrir al análisis de la salida toString() ...
Daniel Sobral tiene una excelente (rápida) descripción general rápida here, en la que obtiene tentadoramente cerca de lo que estoy buscando, pero (aparentemente) sólo si por casualidad usted conoce, por esa clase en particular, algún método específico cuyo tipo puede ser interrogado:
scala> res0.member(newTermName("head"))
res1: reflect.runtime.universe.Symbol = method head
scala> res1.typeSignatureIn(res0)
res2: reflect.runtime.universe.Type = => Int
Pero espero algo más general, que no implique rootear la lista de métodos declarados y esperar que uno de ellos capture (y divulgue) la información del tipo actual de la etiqueta en alguna parte.
Si Scala puede tan fácilmente imprimir "Lista [Int]", ¿por qué es tan difícil descubrir esa parte "Int" de eso, sin recurrir a la coincidencia de patrón de cadena? ¿O simplemente me estoy perdiendo algo realmente obvio?
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 =
Grr ...
Aquí hay una no-respuesta: con M7, al menos, puede obtener los argumentos de tipo echando a un interno API: 'typeOf [List [Int]]. AsInstanceOf [scala.reflect.internal.Types $ TypeApiImpl] .typeArguments'. –
¡listo! Gracias. – Tim