为什么Android Studio显示错误时,我使用2号脚本。我发现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
实际上到那一点时可能为空(同样,因为另一个线程可能已经更改了该值。这将是一个竞争条件)。
您有几个解决方案:
>
使namelist
成为val
,从而使其引用final
。因为它是最终的,所以保证另一个线程不能更改它。这可能不适合您的用例。
class Adapter {
val nameList : ArrayList<String>? = null
}
在进行检查之前,创建一个本地的姓名列表副本。因为它是本地副本,编译器知道另一个线程不能访问它,因此不能更改它。在本例中,可以使用var
或val
定义本地副本,但我建议使用val
。
val nameList = adapter.nameList
if (nameList != null) {
list.addAll(nameList)
}
使用Kotlin提供的一个实用函数来处理这样的情况。let函数使用内联函数将其调用的引用复制为参数。这意味着它可以有效地编译成与#2相同的代码,但它更简洁一些。我更喜欢这个解决方案。
adapter.nameList?.let { list.addAll(it) }
我试图得到一个类,它结合了< code>Kotlin中的列表、集合和映射。我希望编写< code>isScalar函数,如果对象只包含一个元素,它应该返回< code>true 不幸的是,相比之下,它给了我一个错误 说着 据我所知,这与多线程假设有关。在Java,如果期望多线程,我会使函数。此外,如果我不编写线程安全的,我可以完全忽略这一点。 静态编程语言应该怎么写? 我看到了这个解决方案http
我正在尝试获得一个类,它在中组合了list、set和map。我希望编写函数,如果对象只包含一个元素,则该函数应该返回 不幸的是它给了我错误的比较 说 更新2 总结一下,就我的理解,在Kotlin中显式地将variable与进行比较是不可能/不合理的。因为一旦你比较它,下一次你就必须再次用隐式地用类似这样的操作来比较它,而你无法避免这种情况。
为什么当我使用No.2脚本时Android Studio显示错误。我发现1和2之间没有区别。 请解释这个案例
我正在用kotlin为android制作一个小型tasker。我将主要活动分成一些片段,然后为每个片段创建一个视图模型。但是现在这里出现了一个问题。 下面是一些代码: 我本来希望在observer方法的帮助下在主屏幕上看到一些创建的单选按钮,但是我得到了一个例外,这在问题的标题中提到。提前感谢您的帮助!
我尝试将我的代码从java转换为kotlin,因此我面临这个错误。我不明白为什么我会得到这个错误 错误 我只是附加给我一个错误的代码并突出显示它
我还在另一个类中使用了bitmap2和Bitmap1: 这里写着:类型不匹配,必需:位图找到:位图?