java - 如何使用布尔函数?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>())
}
}
你怎么看?
解决方案
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 为空。
推荐阅读
- powershell - 使用 pwd 变量在 powershell 启动时运行命令
- android - 小部件自定义图标 Android
- html - 如何在图标下添加文本而不使它们堆叠?
- android - 如何解决 Kotlin 上的 PagerAdapter 问题:“必需的方法 instantiateItem 未被覆盖”?
- r - 在 R 中按列拆分数据
- java - 抛出自定义异常时如何动态确定方法签名?
- excel - 努力寻找在谷歌表格中实现条件格式的方法
- ios - iOS Firebase 通知仅出现在后台
- nsis - 在 NSIS 中使用特定字体创建控制台应用程序的快捷方式
- heroku - 同时使用 www 和裸域来指向我的 heroku 应用