You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中恢复Kotlin协程Continuation并正确构造Result实例

Java中恢复Kotlin协程CancellableContinuation的正确方案

Kotlin的Result是专门为Kotlin设计的内联值类,其构造方法、Companion.success等API默认对Java侧私有,不支持直接从Java代码构造实例。

方案1(最推荐):用Kotlin封装桥接方法供Java调用

该方案规避了Java侧操作Result的需求,兼容性最好,实现成本极低:

  1. 新增一个Kotlin工具类,封装续体恢复逻辑,添加@JvmStatic注解暴露给Java调用:
import kotlin.coroutines.CancellableContinuation

object CoroutineResumeHelper {
    /**
     * 恢复成功执行的续体
     */
    @JvmStatic
    fun <T> resumeSuccess(continuation: CancellableContinuation<T>, result: T) {
        continuation.resume(result)
    }

    /**
     * 恢复抛出异常的续体
     */
    @JvmStatic
    fun <T> resumeFailure(continuation: CancellableContinuation<T>, throwable: Throwable) {
        continuation.resumeWithException(throwable)
    }
}
  1. Java代码直接调用工具类方法即可完成续体恢复:
// 恢复成功结果
CoroutineResumeHelper.resumeSuccess(someSuspendFunctionContinuation, true);
// 异常场景恢复示例
// CoroutineResumeHelper.resumeFailure(someSuspendFunctionContinuation, new RuntimeException("执行失败"));

方案2:Java侧直接构造Result(不推荐)

如果确实需要在Java侧直接操作Result,可以通过Kotlin标准库提供的内部API构造:

// 构造成功Result
Result successResult = (Result) Result.Companion.constructor-impl(true);
// 构造失败Result
Result failureResult = (Result) Result.Companion.constructor-impl(new RuntimeException("错误"));

// 调用resumeWith
someSuspendFunctionContinuation.resumeWith(successResult);

注意:该方案依赖Kotlin内部实现API,不同Kotlin版本可能存在兼容性变化,生产环境优先使用方案1。

注意事项

  • 存储CancellableContinuation时需要注意内存泄漏,续体恢复后及时置空引用。
  • 可以配合continuation.invokeOnCancellation回调,在协程被取消时清空存储的续体引用,避免后续调用无效续体。

内容的提问来源于stack exchange,提问作者Ricky Mo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:06:05