成员函数不能用作参数
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 并没有说我 不能 这样做。
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
的一个实例
使用以下代码:
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 并没有说我 不能 这样做。
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