kotlin 使用“when in”证明的Map访问的智能转换

svmlkihl  于 2023-01-26  发布在  Kotlin
关注(0)|答案(1)|浏览(113)

我尝试使用Kotlin的when块在不同的Map中查找一个元素,在确认元素存在之后,代码不会将Map中的查找结果智能转换为非空。
以下是最小工作示例:是否有可能重新处理它,从而不需要!!

fun main(args: Array<String>) {
    val string = "abc"
    val map1 = mapOf('a' to 5)
    val map2 = mapOf('b' to 4)
    when (val char = string.firstOrNull()) {
        null -> println("Nothing to find")
        in map1 -> println("Found in map1: ${map1[char]!!+1}")
        in map2 -> println("Found in map2: ${map2[char]!!-1}")
        else -> println("Unrecognised character $char")
    }
}
2wnc66cl

2wnc66cl1#

不幸的是,在Kotlin中,函数不能有“如果f返回true,那么g不返回null”这样的契约,因此编译器不会使用关于contains调用肯定成功的信息。
在这种情况下,!!的解决方案是可行的,因为您可以确保get返回的不是nullwhenKT-186)中复杂模式的实现将通过允许在when子句中声明变量并提供静态保证来涵盖这种用例。

相关问题