2016-07-26 4 views

答えて

6

MapMutableMapにコピーすると、次の拡張機能が動作します。 Kotlinが唯一のコレクションとその不変性を読まについて、前の質問で取り上げとして

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

まず、彼らは本当に唯一可能性の高い可変コレクションの景色を生きて読み込まれます。 Kotlinが知っているインターフェイス上のマーカーがあるので

Kotlinは無事例えば、これらのための可変性のためのタイプを確認することができます。

// 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

実際には変更できないJavaコレクションに対して 'true'を返すことができるので、私は' MutableMap'チェックに対してアドバイスします。たとえば、 'Collections.unmodifiableMap(mutableMapOf(" a "から" b "))はMutableMap <*,*>'です。 –

+0

これは私にとって最善の答えのようです。あなたが追加するかもしれない1つの例は 'HashMap'を直接使用しない例です(' mutableMapOf'は実際に 'LinkedHashMap'を使用します)。例: 'val mutableMap = map.entries.associateTo(mutableMapOf()){entry-> entry.toPair()}'。 – mfulton26

関連する問題