Передача карты из 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
и, следовательно, предоставляет изменяющиеся функции. Однако предпочтительнее использовать интерфейсы, а не классы реализации.