Карта Котлина с ненулевыми значениями

Скажем, что у меня есть карта для перевода буквы игральной карты в целое число

val rank = mapOf("J" to 11, "Q" to 12, "K" to 13, "A" to 14) 

При работе с картой мне кажется, что я всегда должен выполнить нулевую проверку безопасности, даже если Карта и Пара являются неизменными:

 val difference = rank["Q"]!! - rank["K"]!! 

Я предполагаю, что это происходит из того, что общие типы имеют Any? супертип. Почему это невозможно разрешить во время компиляции, когда Map и Pair неизменяемы?

Речь идет не о реализации Карты (будь то Kotlin или Java). Вы используете карту, и на карте может не быть ключа, поэтому оператор [] возвращает тип с нулевым значением.

mapOf () предоставляет карту без гарантий наличия ключа – что-то вроде ожидаемого, особенно учитывая реализацию Java Map.

Хотя я лично предпочитаю придерживаться нулевых вызовов и операторов elvis, похоже, что вы предпочитаете более чистый код на сайте вызова (особенно учитывая, что вы знаете, что эти ключи существуют и имеют связанные ненулевые значения). Учти это:

 class NonNullMap<K, V>(private val map: Map<K, V>) : Map<K, V> by map { override operator fun get(key: K): V { return map[key]!! // Force an NPE if the key doesn't exist } } 

Делегируя реализацию карты, но переопределяя метод get, мы можем гарантировать, что возвращаемые значения не равны нулю. Это означает, что вам больше не нужно беспокоиться о !!,?. Или?: Для вашего использования.

Некоторые простые тестовые коды показывают, что это правда:

 fun main(args: Array<String>) { val rank = nonNullMapOf("J" to 11, "Q" to 12, "K" to 13, "A" to 14) val jackValue: Int = rank["J"] // Works as expected println(jackValue) val paladinValue: Int = rank["P"] // Throws an NPE if it's not found, but chained calls are considered "safe" println(jackValue) } // Provides the same interface for creating a NonNullMap as mapOf() does for Map fun <K, V> nonNullMapOf(vararg pairs: Pair<K, V>) = NonNullMap(mapOf<K, V>(*pairs)) 
Intereting Posts