使用类型标签,我能够see某种类型的参数:
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 可以如此轻松print“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 =
Grr...
从...开始Scala 2.11
,您可以简单地使用:
yourGenericType.typeArgs.head
See the 宏变更日志点号 14。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)