我可以从Kotlin中的函数类型变量获得KFunction吗?

时间:2016-05-02 15:40:12

标签: reflection kotlin

我正在尝试使用

来定义函数的名称
fun aFunction() = Unit

fun functionName(function: () -> Unit) : String {
  val functionAsKFunction: KFunction<Unit> = someMiracle(function)
  return functionAsKFunction.name
}

assertEquals("aFunction", functionName(::aFunction)) 

1 个答案:

答案 0 :(得分:6)

您可以简单地将() -> Unit投射到KFunction<*>。从理论上讲,这是一个实施细节,但我认为它不会破坏。

fun functionName(function: () -> Unit) : String {
  val functionAsKFunction: KFunction<*> = function as KFunction<*> 
  return functionAsKFunction.name
}

编辑:显然,这对lambdas不起作用(无论如何你会想到什么名字?)为了防止崩溃,你可以使用像这样的安全演员:

fun functionName(function: () -> Unit) : String? {
  val functionAsKFunction: KFunction<*> = function as? KFunction<*> ?: return null
  return functionAsKFunction.name
}