为何无法直接将方法传入Kotlin构造器,必须使用Lambda?
Kotlin函数引用与Lambda适配问题解析
先看你的代码场景:
class MyCustomViewAdapter(private val callback: (position: Int) -> Unit) : RecyclerView.Adapter<MyCustomViewHolder>() { ... } // 可行写法 MyCustomViewAdapter({ position -> onClickFlowerCallback(position)}) // 报错写法 MyCustomViewAdapter(onClickFlowerCallback) private fun onClickFlowerCallback(position: Int) { println("We have successfully received click from position #" + position.toString()) }
原因解析
你遇到的问题核心是Kotlin中函数引用的类型和构造参数要求的函数类型不匹配:
- 构造参数
callback的类型是(position: Int) -> Unit,这是Kotlin的函数类型,本质是一种特殊的接口类型,Lambda表达式会被自动适配成这个类型的实例。 - 直接写
onClickFlowerCallback的时候,你传递的是函数本身的引用,它的类型是KFunction1<Int, Unit>(Kotlin反射体系里的函数类型),和构造参数要求的(Int) -> Unit不是同一类型,所以编译器无法识别,报错。
解决方法
如果想直接传递函数引用,需要用::操作符把普通函数转换成符合要求的函数类型实例:
MyCustomViewAdapter(::onClickFlowerCallback)
这样::onClickFlowerCallback就会被转换成(Int) -> Unit类型的对象,和构造参数的类型匹配,就能正常编译了。
另外,第一种Lambda写法还有简化空间:因为Lambda是最后一个参数,可以移到括号外面,甚至利用自动推断的参数it进一步精简:
// 简化写法1 MyCustomViewAdapter { position -> onClickFlowerCallback(position) } // 简化写法2 MyCustomViewAdapter { onClickFlowerCallback(it) }
内容的提问来源于stack exchange,提问作者AlanSTACK
相关产品推荐
相关产品推荐

