繁体   English   中英

如何使用通用 function 作为 Kotlin 中的参数制作通用 function?

[英]How do I make a generic function with generic function as parameter in Kotlin?

在此处输入图像描述

我有大约 20 个文件,看起来像上图中的红色和蓝色部分,现在我想添加private val requestDataSource: RequestDataSource参数(绿色第 15 行)并调用requestDataSource.post() (绿色第 20 行)给所有文件.

我尝试使用自定义参数 P、自定义返回类型 RET 和 function 参数创建通用 function 参数,因此我可以像在sendEz ZC1C425268E68385D1AB5074C17 中一样使用它,但它不起作用。

我在 function 参数上遇到错误:

类型不匹配。 必需:(TypeVariable(P)) → ApiRequestResponse<TypeVariable(RET)> 找到:Boolean Function 调用 'send(...)' 预期

我不明白,我不想在第 30m 行调用它,同时它看起来被视为已调用,因为找到的参数是 boolean ( service.sen(emnail)的返回类型)但我我不在那里叫它......

这是可以实现的吗? 如果是这样,怎么做?

代码在这里:

class EmailDataSource @Inject constructor(
    private val dao: EmailDao,
    private val service: EmailService,
    private val requestDataSource: RequestDataSource,
): BaseDataSource<EmailModel, EmailDataModel>(dao) {
    suspend fun send(email: EmailModel): ApiRequestResponse<Boolean> {
        return try {
            val response = service.send(email)
            requestDataSource.post()
            ApiRequestResponse.Success(response)
        } catch (e: Throwable) {
            val ioe = IOException("Error sending email", e)
            Timber.w(ioe)
            ApiRequestResponse.Error(ioe)
        }
    }

    suspend fun sendEz(email: EmailModel): ApiRequestResponse<Boolean> {
        return call<EmailModel, Boolean>(service.send, email, "Error sending email")
    }

    suspend fun <P: Any, RET: Any> call(
        function: (parameter: P) -> ApiRequestResponse<RET>,
        parameter: P,
        error: String = "Error making the request"
    ): ApiRequestResponse<RET> {
        return try {
            val response = function(parameter)
            requestDataSource.post()
            response
        } catch (e: Throwable) {
            val ioe = IOException(error, e)
            Timber.w(ioe)
            ApiRequestResponse.Error(ioe)
        }
    }
}

一个. 是调用它的语法。 ::仅用于传递对函数的引用。

所以试着把service::send而不是service.send

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM