更新地图时,将地图从 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的Map
和MutableMap
接口都是用java.util.Map
来表示的,所以你可以自由的把你的参数类型改成MutableMap<String, String>
:
fun updateMap(map: MutableMap<String, String>) {
map["foo"] = "bar"
}
请注意,您可能需要在 Kotlin 代码的其他一些地方将 Map
更改为 MutableMap
,因为编译器不允许您传递只读的 Map
作为 MutableMap
参数。
至于 HashMap
,鉴于它是一个具体的实现,它也实现了 MutableMap
,因此公开了变异函数。但是,使用接口而不是实现 类 更可取。
我有一个 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的Map
和MutableMap
接口都是用java.util.Map
来表示的,所以你可以自由的把你的参数类型改成MutableMap<String, String>
:
fun updateMap(map: MutableMap<String, String>) {
map["foo"] = "bar"
}
请注意,您可能需要在 Kotlin 代码的其他一些地方将 Map
更改为 MutableMap
,因为编译器不允许您传递只读的 Map
作为 MutableMap
参数。
至于 HashMap
,鉴于它是一个具体的实现,它也实现了 MutableMap
,因此公开了变异函数。但是,使用接口而不是实现 类 更可取。