Передача карты из Java в Kotlin не компилируется при обновлении карты

У меня есть функция Java с Map<String, Stringи должен передать его функции Kotlin для добавления значений на карту.
Проблема в том, что если у меня есть:

fun updateMap(map: Map<String, String>)

Похоже, что map неизменен, и я не могу: map[KEY] = VALUEкак я получаю ошибку компиляции.
Это сработало бы, если бы я сделал:fun updateMap(map: HashMap<String, String>) но в этом случае я не могу передать оригинал mapиз кода Java без какого-либо приведения, которого я хотел бы избежать, если это возможно.
Какое решение для этого?

1 ответ

Решение

Kotlin, в отличие от Java, имеет отдельные интерфейсы для изменяемых коллекций и коллекций, доступных только для чтения, см. Обзор коллекций Kotlin.

В Map интерфейс в Kotlin не предоставляет никаких модифицирующих функций (включая оператор map[key] = value), но MutableMap делает.

На JVM Котлин Map а также MutableMap оба интерфейса представлены java.util.Map, поэтому вы можете свободно изменить тип параметра на MutableMap<String, String>:

fun updateMap(map: MutableMap<String, String>) {
    map["foo"] = "bar"
}

Обратите внимание, что вам может потребоваться изменить Map к MutableMap в некоторых других местах вашего кода Kotlin, поскольку компилятор не позволит вам передать доступ только для чтения Map как MutableMap аргумент.

Что касается HashMap, учитывая, что это конкретная реализация, он также реализует MutableMapи, следовательно, предоставляет изменяющиеся функции. Однако предпочтительнее использовать интерфейсы, а не классы реализации.

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