[英]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.