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_Mutablemap - Fatal编程技术网

为什么kotlin中两个可变映射的和是一个映射

为什么kotlin中两个可变映射的和是一个映射,kotlin,mutablemap,Kotlin,Mutablemap,我有两个函数返回可变映射 fun mumapone() = mutableMapOf<String, Any>("one" to 1) fun mumaptwo() = mutableMapOf<String, Any>("two" to 1) + mumapone() fakeConfig()的类型仍将是Map,更改此类型的唯一方法是强制转换它或 (xx + yy).toMutatleMap() 重复这个问题,为什么

我有两个函数返回可变映射

fun mumapone() = mutableMapOf<String, Any>("one" to 1)
fun mumaptwo() = mutableMapOf<String, Any>("two" to 1) + mumapone()
fakeConfig()
的类型仍将是Map,更改此类型的唯一方法是强制转换它或

    (xx +  yy).toMutatleMap()
重复这个问题,为什么两个可变映射的和会变成一个映射而不是一个可变映射

干杯


es

当您对两个映射求和时,默认情况下假定的接口是Map,因为MutableMap是接口的一个实现,所以不能假定它用于
+
操作符

但是,如果您想避免强制转换或转换,您可以简单地创建第三个可变映射,并将其中的其他两个映射相加。该贴图将保留该类型,不需要强制转换


kotlin文档中的更多信息:

加号操作仅在映射界面中定义,其结果是一个不可变的映射

MutableMap实现不会覆盖此操作,因此,当您使用MutableMaps调用它时,实际上是在调用一个映射操作,而不是MutableMap操作。 正如你在这里看到的

来自文档:

plus

通过替换或添加来自另一个映射的条目来创建新的只读映射

operator fun <K, V> Map<out K, V>.plus(
    map: Map<out K, V>
): Map<K, V>
operator fun Map.plus(
地图:地图
):地图

通常
+
用于返回新数据结构的不可变操作

您可以为MutableMap实现
+
操作符,但这不是一个好主意,因为该函数已经存在:

fun main() {
    val foo = mutableMapOf(1 to "one", 2 to "two")
    val bar = mapOf(3 to "three", 4 to "four")
    foo.putAll(bar)
    println(foo)
}
输出:

{1=one, 2=two, 3=three, 4=four}
最好使用
+
获取新的不可变映射,或者显式使用可变操作,例如
putAll()

你可以这样写
mumaptowo

fun mumaptwo() = mumapone().putAll(mutableMapOf<String, Any>("two" to 1))
mumapone().putAll(mutableMapOf(“2”到1)) 可变映射提供特定于映射的写入操作。通过这些操作,可以使用基于键的值访问来更改地图内容

MutableMap
只不过是一个具有写入操作的映射

有一些规则定义映射上的写入操作:

值可以更新。反过来,关键点永远不会改变:一旦你添加了一个条目,它的关键点是不变的

对于每个键,始终有一个与之关联的值。您可以添加和删除整个条目

添加操作

要向可变映射添加新的键值对,请使用
put()

要一次添加多个条目,请使用
putAll()

您还可以使用速记运算符表单向地图添加新条目。有两种方法:

plusaSign
(+=)
运算符

set()
[]
运算符别名

fun mumaptwo() = mumapone().putAll(mutableMapOf<String, Any>("two" to 1))