能否为suspend函数编写扩展函数?为何自定义扩展函数无法调用?
为什么为suspend函数类型定义的扩展无法直接在suspend函数调用结果上使用?
核心原因:混淆了「suspend函数类型实例」和「suspend函数的调用结果」
第二种方式定义的扩展函数,是给函数类型suspend () -> T本身添加的方法,只有当调用者是这个函数类型的实例时,才能调用A()。但你写的accountManager.doWork(password)是直接调用了suspend函数,得到的是该函数的返回值T,而非函数类型本身,类型完全不匹配,因此编译报错。
两种实现方式的本质区别
- 第一种是普通函数,参数接收一个
suspend () -> T类型的lambda(即函数类型实例),你调用时传入的{ accountManager.doWork(password) }正是符合类型要求的lambda,所以能正常匹配执行。 - 第二种是函数类型的扩展,它的调用者必须是一个
suspend () -> T类型的对象,比如函数引用、持有该函数类型的变量:
举个正确调用第二种扩展的例子:
// 假设doWork的签名是suspend fun doWork(password: String): Boolean // 调整扩展函数适配带参数的suspend函数类型 suspend fun <T, P> (suspend (P) -> T).A(param: P) { // 执行这个suspend函数 this(param) } // 正确调用:使用函数引用,此时accountManager::doWork的类型是suspend (String) -> Boolean accountManager::doWork.A(password)
如果想要给doWork的返回值添加扩展,应该直接给返回值的具体类型(比如Boolean)定义扩展,而非给函数类型定义扩展。
内容的提问来源于stack exchange,提问作者Mohmmaed-Amleh
相关产品推荐
相关产品推荐

