在Kotlin中,当声明变量类型时,使用冒号。即使在声明LiveData时,也会使用冒号。那么,为什么MutableLiveData使用等号呢?我还没搞清楚。几天前,我花了大约2个小时试图理解为什么我的MutableLiveData变量不起作用,只是意识到我需要的是相等而不是冒号。
示例:
private val _liveData = MutableLiveData<Int>()
val liveData: LiveData<Int>提前感谢!
发布于 2020-06-23 23:09:12
Kotlin自动检测到类型,因此不需要指定它。这些都是等价的
val foo: Int = 123
val foo = 123但是,如果有一个稍后初始化的变量,则必须提供该类型,否则编译器无法确定它是哪种类型。例如,
class MyClass {
val foo: Int // must specify type
init {
foo = /* compute foo */
}
}它与LiveData或MutableLiveData无关。
发布于 2020-06-24 13:26:30
val liveData: LiveData<Int>本身是没有意义的。它也需要初始化。我怀疑您正在研究Android编程中一个相当常见的成语,但忽略了下一行仍然是liveData定义的一部分。
val liveData: LiveData<Int>
get() = _liveData在这里,您需要: LiveData<Int>的原因是,否则Kotlin将推断liveData的MutableLiveData<Int>类型与_liveData的类型相同,而这个成语的全部意义是阻止其他类在其上调用postValue/setValue。
发布于 2020-06-23 23:08:31
那么,为什么MutableLiveData使用等号呢?
因为您正在通过MutableLiveData的构造函数创建一个实例。您没有提供一个类型- Kotlin编译器是从您要分配给属性的对象的类型推断它的。
基本上,你的声明是以下几个字的缩写:
private val _liveData: MutableLiveData<Int> = MutableLiveData<Int>()您可以在谷歌的Kotlin文档中了解有关类型推断的更多信息。
https://stackoverflow.com/questions/62545069
复制相似问题