首页 > 解决方案 > 更新地图时,将地图从 Java 传递到 Kotlin 不会编译

问题描述

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

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

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

标签: kotlinhashmapkotlin-java-interop

解决方案


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

Kotlin 中的Map接口不公开任何修改函数(包括 operator map[key] = value),但MutableMap确实如此。

在 JVM 上,KotlinMapMutableMap接口都由 表示java.util.Map,因此您可以自由地将参数类型更改为MutableMap<String, String>

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

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

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


推荐阅读