Почему сумма двух изменяемых карт в котлине является картой

У меня есть две функции, которые возвращают изменяемые карты

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

тип веселья mumaptwo() становится а не а 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

5 ответов

Решение

Когда вы суммируете две карты, интерфейс, который предполагается по умолчанию, является Map, поскольку MutableMap является реализацией интерфейса, его нельзя предполагать для + оператор.

Однако, если вы хотите избежать преобразования или преобразования, вы можете просто создать третью изменяемую карту и просуммировать две другие карты в ней. Эта карта сохранит тип и не будет нуждаться в приведении.

Дополнительная информация в документации kotlin: https://kotlinlang.org/docs/reference/map-operations.html#map-write-operations

В общем, для неизменяемых операторов, которые возвращают вам новую структуру данных.

Вы можете реализовать оператор для 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().

Вы могли написать mumaptwo так:

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

Изменяемые карты предлагают операции записи для конкретных карт. Эти операции позволяют изменять содержимое карты, используя доступ к значениям на основе ключей.

В MutableMap не что иное, как карта с операцией записи

Есть определенные правила, которые определяют операции записи на картах:

Значения можно обновлять. В свою очередь, ключи никогда не меняются: как только вы добавляете запись, ее ключ остается постоянным.

Для каждого ключа всегда есть одно значение, связанное с ним. Вы можете добавлять и удалять записи целиком.

ДОБАВИТЬ Операция

Чтобы добавить новую пару "ключ-значение" к изменяемой карте, используйте put().

Чтобы добавить несколько записей за раз, используйте putAll()

Вы также можете добавлять новые записи на карты, используя сокращенную форму оператора. Есть два способа:

plusAssign (+=) оператор.

в [] псевдоним оператора для set().

Из документации:

плюс

Создает новую карту, доступную только для чтения, путем замены или добавления записей на эту карту с другой карты.

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

Операция плюса определяется только в интерфейсе Map, и ее результатом является неизменяемая карта.

Реализация MutableMap не отменяет эту операцию, поэтому, когда вы вызываете ее с использованием изменяемых карт, вы фактически вызываете операцию Map вместо операции MutableMap. Как вы можете видеть здесь

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

Другие вопросы по тегам