首页 > 解决方案 > 如何使用布尔函数?Kotlin 中 if 语句中的返回类型

问题描述

我正在使用返回真假的方法(例如方法 containsKey 的 MutableList)。由于该函数是用 java 编写的,Kotlin 将返回类型称为 Boolean?这就是我收到编译错误的原因:“必需:布尔值,找到:布尔值?”。我必须说在某些情况下(不知道为什么)使用该方法是可以的,有时它会返回上面的错误。有人能猜出是什么原因吗?

我的代码:

val gamesPerCountriesMap = mutableMapOf<String,MutableMap<Long, List<AllScoresGameObj>>>()

if (countryName != null  && countryName != "" && !gamesPerCountriesMap.containsKey(countryName))
{
    gamesPerCountriesMap.put(countryName, mutableMapOf<Long,List<AllScoresGameObj>>())
}

if (!gamesPerCountriesMap.get(countryName)?.containsKey(competitionId))
{
    gamesPerCountriesMap.get(countryName)?.put(competitionId, listOf<AllScoresGameObj>())
}

第一个如果编译第二个会出错:

在布尔类型的可空接收器上只允许安全 (?.) 或非空断言 (!!.) 调用?

如果我删除在第二个开头,如果我会出现不同的错误:

类型不匹配:推断类型是布尔值?但布尔值是预期的

阅读所有建议后,我编写了以下代码:

gamesPerCountriesMap.get(countryName)?.let {
    if (!gamesPerCountriesMap.containsKey(it))
    {
        gamesPerCountriesMap.get(countryName)?.put(competitionId, listOf<AllScoresGameObj>())
    }
}

你怎么看?

标签: javaandroidkotlin

解决方案


if (!gamesPerCountriesMap.get(countryName)?.containsKey(competitionId))

将检查项目是否为真、假或空。“if”语句要求真或假。这就是为什么您会看到“类型不匹配:推断的类型是布尔值?但布尔值是预期的”

if (gamesPerCountriesMap.get(countryName) == null || !gamesPerCountriesMap.get(countryName)!!.containsKey(competitionId))

如果该项目为空,或者如果不为空但也不包含竞争ID,则执行此操作,这就是您要使用的。

编辑:

您还希望允许地图包含这样的空值:

val gamesPerCountriesMap = mutableMapOf<String,MutableMap<Long, List<AllScoresGameObj>>?>()

这 ”?” 最后允许嵌套的 MutableMap 为空。


推荐阅读