为什么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并没有专门阻止这一点;只是需要在语言规范、编译器等中添加一些东西,而他们还没有这样做。(请注意,没有单独的?
运算符;?。
本身就是一个运算符,因此您不能仅将?
应用于[
)