Kotlin 在访问 Map 条目方面过于宽松

Pag*_*und 0 kotlin

现在 Kotlin 中的一些事情让我非常沮丧,我不知道如何解决这个问题:

    val map = mapOf(1 to "one")
    val value = map[1] // value is String? instead of String
    val certainlyNot = map[999] // value is String? instead of compiler error
Run Code Online (Sandbox Code Playgroud)

在我看来,编译器应该能够推断出1键的值类型 String ,并且在尝试访问999键时应该阻止编译。

哪种数据结构更适合我的需求?

编辑:上下文 - >我需要访问像这样的循环中的值

    for (key in map.keys) {
        val myValue = map[key] // myValue is String?
                               // but I don't understand why I am forced to do null checks
                               // when the key in question is certainly in the map AND maps to a String
    }
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 5

编译器不知道 Map 中有什么,也不以某种方式跟踪代码中任何点可能出现在 Map 中的所有内容。对于现代计算机来说,这太复杂了,现代计算机必须在您键入时不断编译您的代码。我想这在理论上是可能的,但如果编译器如此复杂,您将无法在处理代码时获得实时编译来显示编译器错误和警告。每次你想检查它时,你都必须停下来编译并等待相当长的时间。

如果您想从已知存在的地图中检索值,请使用getValue()代替[]。这向编译器断言您知道密钥在映射中,因此它不会无法检索它。如果你的断言不正确,它将在运行时抛出异常。

for (key in map.keys) {
    val myValue = map.getValue(key) // myValue is nonnullable String
}
Run Code Online (Sandbox Code Playgroud)