Предположим, у меня есть экземпляр MethodMirror
, созданный для определенного метода объекта. По полям зеркала я могу легко получить доступ к типу возвращаемого значения и параметрам метода. Но мне действительно нужно получить тип, который этот метод имел бы как функцию.Тип функции метода метода из экземпляра MethodMirror в Scala
Вот пример кода игрушки, который поможет мне объяснить, чего я хочу достичь. Я использую 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)
}
}
Я хочу, чтобы произвести Type
экземпляр из methodMirror
, который будет представлять собой функцию. Для этого примера это должно быть (String, String) => Int
. Я бы предпочел решение, которое не слишком сильно зависит от конкретных классов Scala FunctionX
.
Что вы подразумеваете под «Я бы предпочел решение, которое не слишком сильно зависит от конкретных классов функций Scala»? '(String, String) => Int' - это просто другое имя для' Function2 [String, String, Int] ', они действительно то же самое (и, как таковое, ни один из них не более« конкретный », чем другой). –
@ RégisJean-Gilles Я думаю, это означает, что можно построить тип функции из типа метода с помощью 'universe.appliedType' и передать ему' Function2', типы аргументов и тип возвращаемого значения, но OP хочет более общий путь создания eta-расширения для объектов типа. – Kolmar
Ах да, вы правы, возможно, он имел в виду. Благодарю. –