Android 编译器抱怨类型错误,但显然是正确的
我对Kotlin有以下问题,以下是我的代码: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() 数据?让我们{ 发射(数据) }
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) }