为什么我在使用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应该向您发出警告,解释说在执行空检查之后,很可能另一个线程已更改了adapter.nameList
,并且当您调用list.addAll(adapter.nameList)
时,到那时adapter.nameList
实际上可能为空(再次,因为另一个线程可能已更改值。这将是竞争条件)。
您有一些解决方案:
nameList
设为val
,使其成为final
。由于它是最终的,因此可以保证另一个线程无法更改它。这可能不适合您的用例。class Adapter {
val nameList : ArrayList<String>? = null
}
var
或val
定义本地副本,但我建议使用val
。val nameList = adapter.nameList
if (nameList != null) {
list.addAll(nameList)
}
adapter.nameList?.let { list.addAll(it) }