Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么kotlin不允许空安全索引运算符?_Kotlin - Fatal编程技术网

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

为什么kotlin不允许空安全索引运算符?,kotlin,Kotlin,我们习惯于在访问地图时使用索引操作符 fun fun1(map: Map<*, *>) { assert(map.get("key") === map["key"]) } fun1(地图:地图){ 断言(map.get(“key”)==map[“key”]) } 但为什么索引运算符不能用于可为空的映射? 以下代码不编译 fun fun2(map: Map<*, *>?) { assert(map?.get("key") === map?["key"])

我们习惯于在访问地图时使用索引操作符

fun fun1(map: Map<*, *>) {
    assert(map.get("key") === map["key"])
}
fun1(地图:地图){
断言(map.get(“key”)==map[“key”])
}
但为什么索引运算符不能用于可为空的映射? 以下代码不编译

fun fun2(map: Map<*, *>?) {
    assert(map?.get("key") === map?["key"])
}
                                  ^^^ 
fun2(地图:地图?){
断言(map?.get(“key”)==map?[“key”])
}
^^^ 
为什么kotlin不允许空安全索引运算符

无法使用
map?[K]
的原因是不支持这种语法。这是一个长期存在的功能要求。这是一个4年前的版本:

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

fun fun2(map: Map<*, *>?) {
    assert(map?.get("key") === map?.get("key"))
}
fun2(地图:地图?){
断言(map?.get(“key”)==map?.get(“key”))
}

您可以在中找到,
.get()
是实现
[]
运算符的工具。换句话说,编译器在幕后将
[]
转换为
.get()
,因此在这种情况下,您最好直接调用它。

我想是因为语法是
?。
而不是
。我相信OP已经知道这一点。问题是为什么不能将空安全运算符与
[]
一起使用。那么,除了“语法不受支持”之外,您还能说些什么呢?很明显,理论上是可以支持的,但事实并非如此。我现在在回答中加了一条关于这一点的注释。我仍然认为我的回答给出了一些不明显的见解,比如我的建议产生了相同的字节码。真的没什么好说的了。答案是从根本上说,“这是不允许的,因为这是不允许的”,因此我认为这个问题不会那么好。这也是为什么我在评论中猜测而不是发布答案的原因。也就是说,您找到并链接到的功能请求很有趣,您提供的额外信息可能会对其他人有所帮助,如果不是OP的话。值得一提的是,JetBrains并没有专门阻止这一点;只是需要在语言规范、编译器等中添加一些东西,而他们还没有这样做。(请注意,没有单独的
运算符;
?。
本身就是一个运算符,因此您不能仅将
应用于
[