我有一个在 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)
非常感谢@mike-m的建议(如果你想发布答案我会接受)
我更改了代码以明确表示
java.util.Collections.reverse(dataToIncrease)
return dataToIncrease.toMutableList()
...并且在 sdk 35 下编译并运行良好!
IDE 建议使用 kotlin stdlib 更改静态调用,所以现在我有了
dataToIncrease.reverse()
return dataToIncrease.toMutableList()
我查了一下“反向”和“反向”之间的区别,似乎反向总是返回只读结果......因为我从来没有写入从这个函数得到的结果 - 我而是复制它们,看来这段代码对我来说很有效。
感谢您的帮助!