【发布时间】:2015-08-16 23:28:50
【问题描述】:
假设我有一个为某个对象的某个方法创建的MethodMirror 实例。通过镜像的字段,我可以轻松访问方法的返回类型和参数。但我实际上需要获取此方法作为函数的类型。
这是一个玩具代码示例,可以帮助我解释我想要实现的目标。我正在使用 Scala 2.11.6。
import scala.reflect.runtime.universe._
object ForStackOverflow {
object Obj {
def method(x:String, y:String):Int = 0
def expectedRetType():((String, String) => Int) = ???
}
def main(args: Array[String]) {
val mirror:Mirror = runtimeMirror(getClass.getClassLoader)
val instanceMirror = mirror.reflect(Obj)
val methodSymbol:MethodSymbol = instanceMirror.symbol.toType.decl(TermName("method")).asMethod
val methodMirror = instanceMirror.reflectMethod(methodSymbol)
println(methodMirror.symbol.returnType)
println(methodMirror.symbol.paramLists(0).map { x => x.info.resultType }.mkString(", "))
val expectedSymbol:MethodSymbol = instanceMirror.symbol.toType.decl(TermName("expectedRetType")).asMethod
println("I would like to produce from a 'methodMirror' this: "+expectedSymbol.returnType)
}
}
我想从methodMirror 生成Type 实例,它代表一个函数。对于这个例子,它应该是(String, String) => Int。我更喜欢不太依赖具体 Scala 的 FunctionX 类的解决方案。
【问题讨论】:
-
“我更喜欢一个不太依赖具体 Scala 的 FunctionX 类的解决方案”是什么意思?
(String, String) => Int只是Function2[String, String, Int]的另一个名称,它们实际上是一回事(因此,它们中没有一个比另一个更“具体”)。 -
@RégisJean-Gilles 我认为这意味着,可以使用
universe.appliedType从方法类型构造函数类型并将其传递给Function2,参数类型和返回类型,但是 OP想要一种更通用的方法来对类型对象进行 eta 扩展。 -
啊,是的,你是对的,这可能就是他的意思。谢谢。
-
实际上,我一直在寻找 any 方法来解决我的问题。处理这个的通用方法当然更优雅,因为我无法预测原始方法的数量。在写这篇文章之前,我尝试使用
universe.appliedType,但我遇到了一些神秘的错误,我得出的结论是我使用了错误的工具(很少有 Scala 的反射文档与它有关)。
标签: scala reflection scala-2.11 scala-reflect