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

Why is the sum of two mutable maps in kotlin a map

我有两个函数 return 可变映射

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

乐趣类型 mumaptwo() 变成了 Map 而不是 MutableMap,为什么?似乎两个可变映射的总和总是Map,这是为什么?

我也可以使用变量,但输出是一样的

    fun fakeConfig() = xx +  yy
    val xx = mutableMapOf<String, Any>("one", 1)
    val yy = mutableMapOf<String, Any>("two", 1)

fakeConfig() 的类型仍然是 Map,改变它的唯一方法是转换它或

    (xx +  yy).toMutatleMap()

所以重复这个问题,为什么两个可变映射的总和变成一个映射而不是一个可变映射。

干杯,

es

当您将两个映射相加时,默认假定的接口是 Map,因为 MutableMap 是接口的一个实现,它不能假定为 + 运算符。

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

kotlin 文档中的更多信息:https://kotlinlang.org/docs/reference/map-operations.html#map-write-operations

plus操作只定义在Map接口中,其结果是一个不可变的map。

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

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-map/

来自文档:

通过从另一个地图替换条目或向该地图添加条目来创建新的只读地图。

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

一般来说,+ 用于不可变操作符,return 你是一个新的数据结构。

您可以为 MutableMap 实现 + 运算符,但这不是一个好主意,因为 putAll() 函数已经存在:

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()

你可以这样写mumaptwo

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

可变映射提供特定于映射的写入操作。这些操作允许您使用基于键的值访问来更改地图内容。

MutableMap只是一个有写操作的map

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

Values can be updated. In turn, keys never change: once you add an entry, its key is constant.

For each key, there is always a single value associated with it. You can add and remove whole entries.

ADD操作

To add a new key-value pair to a mutable map, use put().

To add multiple entries at a time, use putAll()

您还可以使用 shorthand 运算符形式向地图添加新条目。有两种方式:

plusAssign (+=) operator.

the [] operator alias for set().