编译器抱怨类型错误,但这显然是正确的

时间:2019-06-21 12:56:14

标签: android kotlin

我在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显示不需要强制转换)。

这是编译器中的错误还是我做错了什么?

4 个答案:

答案 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**/