通过反射在斯卡拉2.10查找类型参数?(Finding type parameters via re

2019-06-18 11:41发布

使用类型标签,我能看到一些类型的参数:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> typeOf[List[Int]]
res0: reflect.runtime.universe.Type = List[Int]

但我不能完全弄清楚如何以编程方式获取“内部”离开那里,在一般的方式。

(我一直游荡在REPL了一个小时了,试穿型排列,看看有什么我可以从中获得...我得到了很多的事情,表示这是一个“清单”,但好运气在寻找该“内部”!我真的不希望诉诸解析的toString()输出...)

丹尼尔·索布拉尔具有优良的(像往常一样)快速浏览这里 ,在他得到功亏一篑我正在寻找,但(显然)假如你碰巧知道,对于特定类,一些具体的方法,其类型可以是询问:

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

scala> res1.typeSignatureIn(res0)
res2: reflect.runtime.universe.Type = => 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 = 

格儿...

Answer 1:

可悲的是,我不认为有这将使你的参数的方法,但你可以得到他们抓住这种方式:

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> res0.asInstanceOf[TypeRefApi].args
res1: List[reflect.runtime.universe.Type] = List(Int)


Answer 2:

与开始Scala 2.11 ,你可以简单地使用:

yourGenericType.typeArgs.head

见宏更改日志点数14。



文章来源: Finding type parameters via reflection in Scala 2.10?