现在 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)
编译器不知道 Map 中有什么,也不以某种方式跟踪代码中任何点可能出现在 Map 中的所有内容。对于现代计算机来说,这太复杂了,现代计算机必须在您键入时不断编译您的代码。我想这在理论上是可能的,但如果编译器如此复杂,您将无法在处理代码时获得实时编译来显示编译器错误和警告。每次你想检查它时,你都必须停下来编译并等待相当长的时间。
如果您想从已知存在的地图中检索值,请使用getValue()代替[]。这向编译器断言您知道密钥在映射中,因此它不会无法检索它。如果你的断言不正确,它将在运行时抛出异常。
for (key in map.keys) {
val myValue = map.getValue(key) // myValue is nonnullable String
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |