2016-07-26 79 views

回答

6

以下扩展功能的工作原理是将Map复制到MutableMap

fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> { 
    return HashMap(this) 
} 
9

首先,在覆盖前面的问题有关科特林只读集合及其不变性,他们是真正的只读生活意见可能可变集合的。

科特林可以安全地检查可变性的类型,这些因为有上,让科特林知道接口标记,例如:

// 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,是一个有效的办法知道它是否可浇铸。如果您先进行此项检查,演员阵容中没有危险。你会注意到编译器非常高兴,没有警告。如果您不打算修改被视为只读的相同地图,但显示可以施展影响,则这可能很危险。

如果你不想修改原始地图的机会,那么当然总是通过用另一个地图HashMap(readOnlyMap)调用HashMap的构造函数来复制副本。或进行扩展功能:

fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this) 

,并称之为:

val mutableMap = readOnlyMap.toMutableCopy() 

现在你有你的简单方法。

参见:

+0

我认为你应该明确指定HashMap的泛型,否则你最终会得到一个带有平台键/值类型的映射。 –

+2

我建议不要'MutableMap'检查,因为它可以返回真正的Java集合,这些集合实际上并不可变。例如,尝试'Collections.unmodifiableMap(mutableMapOf(“a”到“b”))是MutableMap <*,*>'。 –

+0

这看起来对我来说是最好的答案。你可能会添加一个例子,它不直接使用HashMap(我相信'mutableMapOf'实际上使用'LinkedHashMap')。例如:'val mutableMap = map.entries.associateTo(mutableMapOf()){entry - > entry.toPair()}'。 – mfulton26