Предположим, у меня есть экземпляр MethodMirror
, созданный для определенного метода объекта. По полям зеркала я могу легко получить доступ к возвращаемому типу и параметрам метода. Но на самом деле мне нужно получить тип, который этот метод будет иметь как функцию.
Вот пример игрушечного кода, который поможет мне объяснить, чего я хочу достичь. Я использую Скала 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
. Я бы предпочел решение, которое не слишком зависит от конкретных классов FunctionX
Scala.
(String, String) => Int
— это просто другое имя дляFunction2[String, String, Int]
, на самом деле это одно и то же (и поэтому ни одно из них не является более конкретным, чем другое). - person Régis Jean-Gilles   schedule 20.08.2015universe.appliedType
и передав емуFunction2
, типы аргументов и тип возвращаемого значения, но OP хочет более общий способ расширения eta для объектов типа . - person Kolmar   schedule 20.08.2015universe.appliedType
перед написанием этого поста, но у меня были некоторые загадочные ошибки, и я пришел к выводу, что использую неправильный инструмент (скудная документация по отражению Scala как-то связана с этим). - person Mr 525   schedule 20.08.2015