为什么在传递Duration时Kotlin函数名称会被破坏

在我当前的 Android 应用程序中,我调查了 Duration 与协程延迟功能的使用,如下所示:-

class WorkerTwo(private val context: Context, private val params: WorkerParameters) : CoroutineWorker(context, params) {

    @ExperimentalTime
    override suspend fun doWork(): Result = coroutineScope {
        (0..100 step 30).forEach {
            setProgress(workDataOf(PROGRESS to it))

            delay(Duration.Companion.seconds(1L)) // CRASH HERE!!!!!!!!!!!!
        }

        Result.success()
    }
}

但是,当我安装并运行我的应用程序时,它会崩溃如下

 Caused by: java.lang.NoSuchMethodError: No static method delay-p9JZ4hM(JLkotlin/coroutines/Continuation;)Ljava/lang/Object; in class Lkotlinx/coroutines/DelayKt; or its super classes (declaration of 'kotlinx.coroutines.DelayKt' appears in /data/app/org.research.development.versiononefive-nC90emPcnKpqBIJrwhWkgQ==/base.apk)
        at org.research.development.versiononefive.WorkerTwo$doWork$2.invokeSuspend(WorkerTwo.kt:19)
 

delay方法名被错位到delay-p9JZ4hM,为什么会发生这种情况?

更新

我通过将它添加到我的 gradle 文件中来解决这个问题

implementation "androidx.work:work-runtime:2.7.0-alpha03"
implementation "androidx.work:work-runtime-ktx:2.7.0-alpha03"

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-RC"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0-RC"

并像这样重构延迟函数调用:-

delay(Duration.seconds(1L)) // CRASH HERE!!!!!!!!!!!!

回答

Duration是一个内联类(Kotlin 1.5+ 中的值类)。

这意味着在 JVM 中根本没有Duration类。它由没有包装器的Double(Long在 1.5+ 中)表示。

当您编写一个将内联类作为参数的方法时,Kotlin 会修改名称,使其与采用基础值的重载不具有相同的签名,即,这样您就可以同时拥有两者delay(Duration)delay(Double)即使在JVM 的参数类型是一样的。

关于你的错误:

如前所述,内联类在 Kotlin 1.5 中更改为值类,并且还有一个新功能允许显式设置方法的 JVM 名称。

您的错误的可能原因是您正在编译 Kotlin 1.5 并使用旧版本的库运行,反之亦然,并且delay一个与另一个的混淆名称不同。此外, 的基础类型Duration已更改,因此即使名称匹配,您也无法调用该方法。


以上是为什么在传递Duration时Kotlin函数名称会被破坏的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>