从compileSdk 34更新到35会导致运行时找不到java.util.List java.util.List.reversed()

问题描述 投票:0回答:1

我有一个在 Android Studio 中编译的 Kotlin 库项目,每当进行小的代码调整时,我都会尝试使其保持最新状态。

我最近做了一个小调整,IDE建议从targetSdkVersion 34更新到targetSdkVersion 35

当我这样做时,它编译得很好,但我收到运行时错误(在我的测试中),像这样

java.lang.NoSuchMethodError: 'java.util.List java.util.List.reversed()'

发生这种情况是因为这个小函数末尾有一个“有问题的”行:

fun MutableList<Byte>.increaseDataLengthBy(numberToIncrease: Int): MutableList<Byte> {
    val dataToIncrease = this
    //The increase method adds zeros to the right so we need to reverse the data so the zeros will
    //be in the left, therefore, if the original data length is larger than 1 we need to reverse it first,
    //so the final reverse will return it to its original order.
    if (dataToIncrease.size > 1) {
        dataToIncrease.reverse()
    }

    for (i in 0 until numberToIncrease) dataToIncrease.add(0)

    return dataToIncrease.reversed().toMutableList() // <-- THIS HAS THE ERROR
}

现在在 IDE 中,我可以将鼠标悬停在“reversed”一词上,它会显示一个小窗口,讨论 Kotlin.collections 以及此函数如何“返回包含相反顺序元素的列表”,并且代码似乎存在,所以为什么我要这样做收到此运行时错误?

(你可能会问,“你为什么要搞这些‘反向’废话,只需使用

addFirst()
”,这是一个很好的观点,但它似乎只适用于 sdk 35 以上,我需要向后兼容至少 26)

kotlin android-studio collections runtime-error
1个回答
0
投票

非常感谢@mike-m的建议(如果你想发布答案我会接受)

我更改了代码以明确表示

java.util.Collections.reverse(dataToIncrease)
return dataToIncrease.toMutableList()

...并且在 sdk 35 下编译并运行良好!

IDE 建议使用 kotlin stdlib 更改静态调用,所以现在我有了

dataToIncrease.reverse()
return dataToIncrease.toMutableList()

我查了一下“反向”和“反向”之间的区别,似乎反向总是返回只读结果......因为我从来没有写入从这个函数得到的结果 - 我而是复制它们,看来这段代码对我来说很有效。

感谢您的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.