2016-07-26 83 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