成员函数不能用作参数

Member function cannot be used as argument

使用以下代码:

fun someFun(x: Any) {

}

fun foo(bar: (val x: Any) -> Unit) {

}

fun baz() {
    foo(::someFun)
}

class Test {
    fun someFun(x: Any) {

    }

    fun foo(bar: (val x: Any) -> Unit) {

    }

    fun baz() {
        foo(::someFun)
    }
}

在class的代码outside中,一切正常,没有错误。在调用 foo 的 Test::baz 处,出现以下错误:

Error:(53, 13) Kotlin: Type mismatch: inferred type is kotlin.reflect.KMemberFunction1 but (kotlin.Any) -> kotlin.Unit was expected

为什么我不能像这样使用成员函数作为参数? The documentation 并没有说我 不能 这样做。

Documentation

If we need to use a member of a class, or an extension function, it needs to be qualified, and the result will be of type “extension function”, e.g. String::toCharArray gives us an extension function for type String: String.() -> CharArray.

foo(Test::someFun)

类型更改为:

bar: Test.(Any) -> Unit

您也可以只将 lambda 传递给函数来解决这个问题:

foo { bar -> someFun(bar) }

测试内部 class

更改代码

fun baz() {
    foo(::someFun)
}

fun baz() {
    foo(this::someFun)
}

就能解决问题![​​=15=]

如果你想引用一种函数,假设

(Int,Int)->String

你有 class A

class A{
    fun whatever(a:Int,b:Int) = "${a},${b}"
}

您可以使用 A()::whatever 引用函数 其中 A() 表示 A

的一个实例