Kotlin传入其他类挂起函数引用作为参数报类型不匹配如何解决?
问题原因
类型不匹配的核心是Kotlin中类成员函数的引用默认携带接收者参数:
- 你定义的
performSomeOperation要求入参是签名为suspend (String, Int) -> SomeType的挂起函数,仅需2个入参,属于KSuspendFunction2类型 OtherClass::performOperation作为类成员函数引用,必须额外传入一个OtherClass实例作为接收者才能执行,完整签名为suspend (OtherClass, String, Int) -> SomeType,总计3个入参,对应报错中的KSuspendFunction3类型,二者类型不匹配。
解决方案
根据业务场景选择以下任意一种修复方式即可:
方案1:绑定实例后传递函数引用
如果你已经持有OtherClass的实例,直接用实例获取函数引用,接收者会自动绑定到实例上,剩余参数正好匹配要求:// 假设已实例化OtherClass得到对象otherInstance performSomeOperation(otherInstance::performOperation)方案2:修改参数为带接收者的函数类型
如果你需要在performSomeOperation内部才指定调用的OtherClass实例,可以直接修改入参声明为带接收者的挂起函数类型:private suspend fun performSomeOperation( block: suspend OtherClass.(String, Int) -> SomeType ) : Result<SomeValue> { // 内部调用时用目标实例调用block即可 val targetInstance = OtherClass() val execResult = targetInstance.block("testId", 1) // 其余业务逻辑 }修改后直接传入
OtherClass::performOperation即可正常编译。方案3:手动包装lambda
也可以通过匿名lambda完成调用,灵活度更高:val otherInstance = OtherClass() performSomeOperation { id, value -> otherInstance.performOperation(id, value) }
内容的提问来源于stack exchange,提问作者ran8080
相关产品推荐
相关产品推荐

