如何从java类访问kotlin代码

问题描述

嗨,我有一个 kotlin 用例,我想从 Java 代码调用它,我该怎么做。这是我试过的

这是我的用例

@PerApp
class OnStandUseCase @Inject constructor(
    private val orderRepository: OrderRepository,private val serviceOrderTypeProvider: ServiceOrderTypeProvider
) : UseCaseCoroutine<GenericResponse,OnStandUseCase.Params>() {

    override suspend fun run(params: Params) = orderRepository.notifyOnStand(
        serviceOrderTypeProvider.apiPathFor(params.serviceType),params.id,params.action
    )

    data class Params(val serviceType: String,val id: String,val action: TimestampedAction)
}

用例协程

abstract class UseCaseCoroutine<out Type,in Params> where Type : Any {

    abstract suspend fun run(params: Params): Type

    operator fun invoke(params: Params,onResult: (type: Type) -> Unit = {}) {
        val job = GlobalScope.async(dispatchers.IO) { run(params) }
        GlobalScope.launch(dispatchers.Main) { onResult(job.await()) }
    }
}

这就是我在我的 kotlin 类中调用它的方式

  try {
            onStandUseCase(OnStandUseCase.Params(serviceType,id,action)) {
                callback.invoke(it)
            }
        } catch (exception: Exception) {
            onStandResponseErrors()
        }

但是从java类调用的等价物是什么

这是我试过的

 onStandUseCase.run(new OnStandUseCase.Params("abcd","1",new TimestampedAction("1","2"))){
            
        }

我收到错误 Expected 2 arguments but found only one

不确定从 Java 代码调用用例的正确方法是什么

请提出任何建议

谢谢 R

解决方法

您不能从 Java 调用 suspend 函数。 (技术上可以,但正确会非常困难,我强烈建议您避免尝试。)

在您的 Kotlin 代码中,编写一个不是挂起函数的函数,该函数将其转换为适当的 Java 习惯用法——RxJava 结果或未来。改为从 Java 调用 那个 方法。