增加可变映射值会导致可为空的接收器错误

Incrementing the mutable map value results in a nullable receiver error

我是 Kotlin 的新手并尝试 google 它,但我不明白。

此处示例: https://try.kotlinlang.org/#/UserProjects/q4c23aofcl7lb155oc307cnc5i/sgjm2olo277atiubhu2nn0ikb8

代码:

fun main(args: Array<String>) {
    val foo = mutableMapOf('A' to 0, 'C' to 0, 'G' to 0, 'T' to 0)
    foo['A'] = foo['A'] + 1
    println("$foo['A']")    
}

我不明白;为什么索引运算符 return 是可空类型?示例中的地图定义为 Map<Char, Int>,而不是 Map<Char, Int?>.

我可以通过非空断言覆盖它,所以这有效:

foo['A'] = foo['A']!!.plus(1)

有没有更简洁的方法?

您可以对任意字符使用索引运算符,即使是那些不属于映射的字符,例如不存在的键。有两个明显的解决方案,要么抛出异常,要么 return null。正如您在文档中看到的,operator fun get中的标准库returns null,索引运算符翻译为:

/**
 * Returns the value corresponding to the given [key], or `null` if such a key is not present in the map.
 */
public operator fun get(key: K): V?

备选方案是 getValue,描述如下:

Returns the value for the given [key] or throws an exception if there is no such key in the map.

这样使用:val v: Int = foo.getValue('A')