// assuming some variable readOnlyMap of type Map<String, String>
val mutableMap: MutableMap<String, String> = if (readOnlyMap is MutableMap<*,*>) {
readOnlyMap as MutableMap
} else {
HashMap(readOnlyMap)
}
这个 is 检查在内部调用 TypeIntrinsics.isMutableMap 并且是一种有效的方法来知道它是否可以转换 . 如果您先进行此检查,则演员阵容中没有任何危险 . 您'll note the compiler is perfectly happy and without warnings. This could be dangerous if you don' t打算修改被视为只读的同一 Map ,但表明您可以为效果进行转换 .
2 回答
Update: Kotlin 1.1 stdlib具有
.toMutableMap()
功能 . 应该使用它而不是创建自己的 .-----------------------下面的旧答案------------------------ ------
以下扩展功能通过将
Map
复制到MutableMap
来工作 .其他一些答案建议检查 Map 是否为
MutableMap
,如果是,则转换为它 . 应该不惜一切代价避免这种情况,因为这是一种不好的做法 . 在Kotlin中它被低估到Map
的事实意味着它不应该被改变,并且这样做是危险的 .首先,正如之前关于Kotlin只读集合及其不变性的问题所述,它们实际上只是对可能的可变集合的实时视图 .
Kotlin可以安全地检查这些类型的可变性,因为接口上有标记让Kotlin知道,例如:
这个
is
检查在内部调用TypeIntrinsics.isMutableMap
并且是一种有效的方法来知道它是否可以转换 . 如果您先进行此检查,则演员阵容中没有任何危险 . 您'll note the compiler is perfectly happy and without warnings. This could be dangerous if you don' t打算修改被视为只读的同一 Map ,但表明您可以为效果进行转换 .如果你不想修改原始 Map 的机会,那么当然总是通过简单地用另一个Map调用HashMap的构造函数来创建一个副本,
HashMap(readOnlyMap)
. 或者做一个扩展功能:并称之为:
现在你有了简单的方法 .
See also:
Kotlin and Immutable Collections?
How to turn a Mutable Collection into an Immutable one
Kotlin Editing List
Kotlin Instantiate Immutable List
Klutter library Immutable wrappers