Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 编译器抱怨类型错误,但显然是正确的_Android_Kotlin - Fatal编程技术网

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

Android 编译器抱怨类型错误,但显然是正确的,android,kotlin,Android,Kotlin,我对Kotlin有以下问题,以下是我的代码: val dishesBitmaps: LiveData<List<Bitmap>> = liveData { val data = getDishesBitmaps() data?.let { emit(data) } } val dishesBitmaps:LiveData=LiveData{ val data=getDishesBitmaps() 数据?让我们{ 发射(数据) }

我对Kotlin有以下问题,以下是我的代码:

val dishesBitmaps: LiveData<List<Bitmap>> = liveData {
    val data = getDishesBitmaps()
    data?.let {
        emit(data)
    }
}
val dishesBitmaps:LiveData=LiveData{
val data=getDishesBitmaps()
数据?让我们{
发射(数据)
}
}
getDishesBitmaps()
返回
List?
但是,编译器显示以下错误

类型推断失败。预期类型不匹配:推断类型为LiveData?>但预期为LiveData>

但在空检查后,
数据
明显变为
列表
。奇怪的是,如果我像下面这样显式地强制转换它(数据作为列表)(但是IDE再次显示不需要强制转换),它编译得很好


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

只需在
LiveData
后面加一个
。看起来它可以为空。或者您可以保持原样,将
数据?
更改为
数据

是,因为您正在数据上添加空安全设置

数据?让我们{ 发射(数据) }

但是您的函数返回类型不是空的,因此您需要在函数中添加。所以它可以是空值

val dishesBitmaps: LiveData<List<Bitmap>>? = liveData {
    val data = getDishesBitmaps()
    data?.let {
        emit(data)
    }
}
val dishesBitmaps:LiveData?=实时数据{
val data=getDishesBitmaps()
数据?让我们{
发射(数据)
}
}
这段代码转换为

if (date != null) emit(data) else null
如果要返回空安全对象,请使用elvis

data?.let {
    emit(data)
} ?: /**code if data is null**/
但在空检查后,数据明显变为
列表

编译器可以在那里进行智能转换,但我想目前没有。做更简单的事

if (data != null) { emit(data) }
应该有用。通常使用
?。如果选中的值是
var
,则改为使用

emit(it)
起作用的原因是为
let
推断的类型参数

奇怪的是,如果我像下面这样显式地强制转换它(数据作为列表)
(但是IDE再次显示不需要强制转换),它编译得很好

这本身并不奇怪,通过演员阵容,你告诉编译器“你认为
数据的类型是什么并不重要,我更清楚”。即使您有
数据:Any?
,它也会编译


显示CAST是不必要的IDE是奇怪的部分和一些我认为是错误的(可以通过使CAST实际上不必要来固定)。< / P>如果您将代码更改为<代码> EIT(IT)< /代码>,该错误是否消失?@普通SWYES,使用<代码> EIT(IT)

it compiles如果您试图强制使用类型:val data:List=getDishesBitmaps()@xavierboculet,正如我所说的,如果我强制使用类型,它会正常工作。令我惊讶的是,IDE和编译器在本例中的行为不同,分析了我没有立即看到的代码类型推断pb。emit(it)是一种方法,它的思想是在发出数据之前检查可空性,而我的第二条语句则起到了帮助作用
if (data != null) { emit(data) }