更新地图时,将地图从 Java 传递到 Kotlin 不会编译

Passing a Map from Java to Kotlin does not compile when updating the map

我有一个 Java 函数,它有一个 Map<String, String 并且需要将它传递给 Kotlin 函数以向地图添加值。
问题是如果我有:

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

似乎 map 是不可变的,我不能这样做:map[KEY] = VALUE 因为我遇到编译错误。
如果我这样做会起作用: fun updateMap(map: HashMap<String, String>) 但在那种情况下,我无法在没有一些强制转换的情况下从 Java 代码传递原始 map ,如果可能的话,我想避免这种情况。
解决方案是什么?

Kotlin 与 Java 不同,它具有用于可变和只读集合的​​单独接口,请参阅 Kotlin Collections Overview

Kotlin 中的 Map 接口不公开任何修改函数(包括运算符 map[key] = value),但 MutableMap 公开。

在JVM上,Kotlin的MapMutableMap接口都是用java.util.Map来表示的,所以你可以自由的把你的参数类型改成MutableMap<String, String>:

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

请注意,您可能需要在 Kotlin 代码的其他一些地方将 Map 更改为 MutableMap,因为编译器不允许您传递只读的 Map 作为 MutableMap 参数。

至于 HashMap,鉴于它是一个具体的实现,它也实现了 MutableMap,因此公开了变异函数。但是,使用接口而不是实现 类 更可取。