成员函数不能用作参数

时间:2015-04-21 20:18:30

标签: kotlin

使用以下代码:

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)
    }
}

在类的 outside 代码中,一切正常,没有错误。在Test :: baz中调用foo时,我收到以下错误:

  

错误:(53,13)Kotlin:类型不匹配:推断类型是kotlin.reflect.KMemberFunction1但是(kotlin.Any) - >预计kotlin.Unit

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

2 个答案:

答案 0 :(得分:3)

  

Documentation

     

如果我们需要使用类的成员或扩展函数,则需要对其进行限定,结果将是“扩展函数”类型,例如String :: toCharArray为我们提供了String类型的扩展函数:String。() - > CharArray。

foo(Test::someFun)

类型更改为:

bar: Test.(Any) -> Unit

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

foo { bar -> someFun(bar) }

答案 1 :(得分:0)

在Test类中

更改代码

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

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

会解决问题!

如果您想引用某种功能,请说

(Int,Int)->String

你有A级

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

您可以使用A()::whatever引用该功能 其中A()表示A

的实例