gpt4 book ai didi

android - Kotlin "Smart cast is impossible, because the property could have been changed by this time"

转载 作者:IT老高 更新时间:2023-10-28 13:31:31 29 4
gpt4 key购买 nike

当我使用 No.2 脚本时,为什么 Android Studio 会显示错误。我发现 1 和 2 没有区别。

class Adapter {
var nameList : ArrayList<String>? = null
}

class Program {
private fun send() {
val list: ArrayList<String> = ArrayList()
val adapter = Adapter()

// Case 1
var otherList = adapter.nameList
if (otherList != null) {
list.addAll(otherList) // <--- no error
}

// Case 2
if (adapter.nameList!=null) {
list.addAll(adapter.nameList) // <--- Error here
// Smart cast to 'kotlin.collections.ArrayList<String> /* = java.util.ArrayList<String> */' is impossible, because 'adapter.nameList' is a mutable property that could have been changed by this time
}
}
}

请解释一下这个案例

最佳答案

IDE 应该给你一个警告,说明在 null 检查之后,adapter.nameList 可能被另一个线程更改,并且当你调用 list.addAll(adapter .nameList), adapter.nameList 到那时实际上可能为空(同样,因为不同的线程可能已经更改了值。这将是一个竞争条件)。

您有几个解决方案:

  1. nameList 设为 val,使其引用 final。由于它是最终的,因此可以保证另一个线程无法更改它。这可能不适合您的用例。

    class Adapter {
    val nameList : ArrayList<String>? = null
    }
  2. 在您进行检查之前,请创建一份名单的本地副本。因为它是本地副本,编译器知道另一个线程无法访问它,因此无法更改它。在这种情况下,可以使用 varval 定义本地副本,但我建议使用 val

    val nameList = adapter.nameList
    if (nameList != null) {
    list.addAll(nameList)
    }
  3. 使用 Kotlin 为这种情况提供的实用功能之一。 let 函数使用内联函数将调用它的引用作为参数复制。这意味着它可以有效地编译为与#2 相同,但它更简洁一些。 我更喜欢这个解决方案。

    adapter.nameList?.let { list.addAll(it) }

关于android - Kotlin "Smart cast is impossible, because the property could have been changed by this time",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46701042/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com