Tim*_*Tim 22 reflection scala 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]
Run Code Online (Sandbox Code Playgroud)
但我只是不知道如何以一般方式以编程方式从那里获得"Int".
(我已经在REPL中闲逛了一个小时,在Type上尝试排列,看看我能从中得到什么......我得到了很多东西,表明这是一个"列表",但是找到了好运"Int"!我真的不想解析toString()输出......)
丹尼尔·索布拉尔(Daniel Sobral)在这里有一个很好的(通常)快速概述,其中他非常接近我正在寻找的东西,但(显然)只有你碰巧知道,对于那个特定的类,一些特定的方法,其类型可以是询问:
scala> res0.member(newTermName("head"))
res1: reflect.runtime.universe.Symbol = method head
scala> res1.typeSignatureIn(res0)
res2: reflect.runtime.universe.Type = => Int
Run Code Online (Sandbox Code Playgroud)
但我希望有一些更通用的东西,它不涉及在声明的方法列表中生根,并希望其中一个将捕获(并因此泄露)标签的当前类型信息.
如果Scala可以如此轻松地打印 "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 =
Run Code Online (Sandbox Code Playgroud)
格儿...
jua*_*cks 16
从开始Scala 2.11,您可以简单地使用:
yourGenericType.typeArgs.head
Run Code Online (Sandbox Code Playgroud)
请参阅宏更改日志点编号14.
Pau*_*her 14
可悲的是,我不认为有一种方法可以为您提供参数,但您可以通过这种方式获取它们:
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
Run Code Online (Sandbox Code Playgroud)
编辑 这是一个更好的方法来实现相同的事情(在讨论scala-internals之后):
scala> res0.asInstanceOf[TypeRefApi].args
res1: List[reflect.runtime.universe.Type] = List(Int)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5294 次 |
| 最近记录: |