参考扩展功能?

pli*_*yar 5 kotlin

是否有可能像普通函数那样引用扩展函数(参见此处)?

我希望下面的代码可以编译,但现在::String.toSomething还不知道:

fun String.toSomething() = length + 1
val some = listOf("lala", "bebebe").map(::String.toSomething)
Run Code Online (Sandbox Code Playgroud)

ele*_*ect 6

你的意思是这样的吗?

fun String.toSomething() = length + 1
val some = listOf("lala", "bebebe").map(String::toSomething)
Run Code Online (Sandbox Code Playgroud)

只记得::在函数之前总是放


Grz*_*rek 5

在Kotlin中引用扩展方法可以通过::在类名和方法名之间应用运算符来完成:

val function = Object::myExtensionMethod
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下:

fun String.toSomething() = length + 1
val some = listOf("lala", "bebebe").map(String::toSomething)
Run Code Online (Sandbox Code Playgroud)


Jar*_*zek 5

OP 将扩展函数定义为独立函数。如果将扩展函数视为另一个类的一部分,则引用是不可能的。至少 Intellij 是这么告诉我的。

class MyClass {
  // This function cannot be referenced.
  fun Application.myExt() {
    return "value"
  }
}
Run Code Online (Sandbox Code Playgroud)

作为解决方法,我做了这样的事情:

class MyClass {
  fun getMyExtFunction: (Application.() -> Unit) {
    return {
      return "value"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我不再引用函数,而是从另一个方法返回该函数。结果是一样的。