我在Kotlin中遇到以下问题,这是我的代码:
val dishesBitmaps: LiveData<List<Bitmap>> = liveData {
val data = getDishesBitmaps()
data?.let {
emit(data)
}
}
getDishesBitmaps()
返回List<Bitmap>?
,但是,编译器向我显示以下错误
类型推断失败。预期的类型不匹配:推断的类型为LiveData?>,但预期为LiveData>
,但data
在经过空检查后显然变成List<Bitmap>
。奇怪的是,如果我像这样emit(data as List<Bitmap>)
显式地进行强制转换,它可以很好地编译(但是再次,IDE显示不需要强制转换)。
这是编译器中的错误还是我做错了什么?
答案 0 :(得分:1)
但经过空检查后,数据显然变为
List<Bitmap>
编译器可以在此处进行智能转换,但我想目前还不能。做得简单
if (data != null) { emit(data) }
应该工作。通常使用?.let
的原因是,如果检查的值是var
,则此处不适用。
emit(it)
起作用的原因是为let
推断出的类型参数。
奇怪的是,如果我像这样
emit(data as List<Bitmap>)
显式地进行强制转换,它可以很好地编译(但IDE再次表明不需要强制转换)。
这本身并不奇怪,通过强制转换,您告诉编译器“ data
的类型无关紧要,我知道更好”。即使您有data: Any?
,它也会编译。
显示强制转换的IDE是不必要的,这是一个奇怪的部分,我会认为是一个错误(可以通过使强制转换实际上是不必要的来解决)。
答案 1 :(得分:0)
只需在?
之后放置LiveData<List<Bitmap>>
。看起来像是可为空的。或者,您可以保留原样并将data?
更改为data!!
答案 2 :(得分:0)
是的,因为您要为数据添加null安全性
data?.let { 发射(数据) }
但是您的函数返回类型不为null,因此您需要在函数中添加?。因此它可以为空值
val dishesBitmaps: LiveData<List<Bitmap>>? = liveData {
val data = getDishesBitmaps()
data?.let {
emit(data)
}
}
答案 3 :(得分:0)
data?.let {
emit(data)
}
此代码段转换为
if (date != null) emit(data) else null
如果要返回空安全对象,请使用猫王
data?.let {
emit(data)
} ?: /**code if data is null**/