Kotlin中如何无需Lambda将方法加入listOf?为何直接引用报错?
问题解答
报错原因
直接写tasks.hide时,Kotlin编译器会默认把它当成无参数方法的调用——Kotlin允许无参方法省略括号执行,所以编译器觉得你是想调用hide()却漏写了括号,才抛出“function invocation 'hide()' expected”错误。它根本没把hide当成函数引用,而是当成了方法调用的简写。
不用Lambda实现函数引用的方法
完全可以像C++函数指针那样直接存方法引用,只要用Kotlin的::操作符明确获取函数引用就行。
假设你的Tasks object是这么定义的:
object Tasks { fun hide() { println("Hide") } fun show() { println("Show") } fun exit() { println("Exit") } }
直接用::拿方法引用塞进listOf:
val actions = listOf( Tasks::hide, Tasks::show, Tasks::exit )
这时候actions的类型是List<() -> Unit>,和用Lambda的方式完全一致,调用的时候直接执行就行:
actions[0]() // 执行hide方法
额外说明
- 如果是在
Tasks内部引用自身方法,直接写::hide、::show就行,不用加Tasks::前缀。 ::是Kotlin里获取函数、属性引用的标准操作符,它返回的Function对象本质和Lambda等价,但写法更简洁,也更贴近你想要的“函数指针”效果。
内容的提问来源于stack exchange,提问作者HumanPeople
相关产品推荐
相关产品推荐

