首页 > 解决方案 > 为什么 kotlin 不允许空安全索引运算符?

问题描述

我们在访问 Maps 时已经习惯了索引操作符。

fun fun1(map: Map<*, *>) {
    assert(map.get("key") === map["key"])
}

但是为什么索引运算符不能用于可为空的 Map 呢?以下代码无法编译。

fun fun2(map: Map<*, *>?) {
    assert(map?.get("key") === map?["key"])
}
                                  ^^^ 

标签: kotlin

解决方案


为什么 kotlin 不允许空安全索引运算符?

您不能使用的原因map?.[K]是因为它不受支持的语法。这是一个长期存在的功能要求。这是一个 4 年前的问题: https ://youtrack.jetbrains.com/issue/KT-8799

请改用等效的方法语法,即map.get(T)代替map[T],即您首先拥有的方法:

fun fun2(map: Map<*, *>?) {
    assert(map?.get("key") === map?.get("key"))
}

您可以在官方文档中找到.get()实现该[]运算符的内容。也就是说,编译器是在幕后翻译[].get(),所以这种情况下还不如直接调用。


推荐阅读