如何获取Scala函数的参数/返回类型?

Tyc*_*cho 6 reflection scala anonymous-function scala-macros

我有一个函数,并希望获取其参数类型和返回类型以供在Scala宏中使用.

scala> val fn = (a: String, b: Double) => 123
fn: (String, Double) => Int = <function2>

scala> fn.getClass
res1: Class[_ <: (String, Double) => Int] = class $anonfun$1
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,参数类型和返回类型已经在两行打印,但我不知道如何访问它们.即使toString我会坚持的<function2>,并class $anonfun$1在部分权=标志-否则有点难看字符串解析的可能已经完成.

我发现MethodSymbolApi提供了一种方法来提取方法的信息,但似乎这可能对这种特殊情况没有帮助.

我目前正在研究AST解析(作为其中的一部分scala.meta)来提取信息,但我认为这个问题看起来很基本,可以被标准反射库覆盖,尽管我没有在那里找到我想要的东西. .有任何想法吗?

根据@ johanandren的回答编辑:

我还没有找到一种更简洁的方法从TypeTag/Type中提取它们,但这确实有效.:)

scala> val fn = (a: String, b: Double) => 123
scala> import scala.reflect.runtime.{universe => ru}
scala> def getTypeTag[T: ru.TypeTag](obj: T) = ru.typeTag[T]
scala> getTypeTag(fn).tpe.toString.split(" => ")
res179: Array[String] = Array((String, Double), Int)
Run Code Online (Sandbox Code Playgroud)

joh*_*ren 3

getClass 是 Java 反射 API 的一部分,它不太理解 Scala 类型,您应该查看 Scala Reflection API。这应该可以帮助您开始,http://docs.scala-lang.org/overviews/reflection/overview.html

不确定,但我认为函数类型的 TypeTag 就是您想要的。

  • 因此,`A =&gt; R`等实际上是具体类的语法糖 - `Function1[A, R]`、`Function2[A, B, R]`等,因此您可以访问作为返回值的类型参数取最后一个,就像这样`typeTag.tpe.typeArgs.last` (3认同)