Mapa de Kotlin con valores no nulos

Digamos que tengo un Mapa para traducir una letra de un naipe a un número integer

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

Cuando trabajo con el map, parece que siempre tengo que hacer una comprobación de security nula a pesar de que el map y el par son inmutables:

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

Supongo que esto proviene de que los types generics tienen Any? supertipo. ¿Por qué no se puede resolver esto en el momento de la compilation cuando tanto el map como el par son inmutables?

No se trata de la implementación de Map (ya sea Kotlin o Java). Está utilizando un Mapa y un map puede no tener una key, por lo tanto, el operador [] devuelve un tipo que admite nulos.

mapOf () proporciona un Mapa sin garantías para la presencia de una key, algo que se espera, especialmente teniendo en count la implementación de Java de Map.

Aunque personalmente podría preferir seguir con las llamadas null-safe y los operadores elvis, parece que preferiría un código más limpio en el sitio de llamadas (especialmente si se sabe que estas keys existen y que tienen valores asociados no nulos). Considera esto:

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

Al delegar en una implementación de map, pero anulando el método get, podemos garantizar que los valores de retorno no sean nulos. Esto significa que ya no tiene que preocuparse por!,?. O?: Por su uso.

Un código de testing simple muestra que esto es cierto:

 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 considenetworking "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)) 
  • ¿Imponer una compilation de methods estáticos dentro de una subclass con Kotlin?
  • ¿Cuál es la causa más probable de que las excepciones escapen misteriosamente de un bloque try-catch en este caso?
  • ¿Cómo puedo declarar una list con valores en una sola línea en kotlin?
  • Kotlin: ¿Kotlin-script (.kts) no puede usar el código regular?
  • Obtener class de list con generics, por ejemplo: Lista <Número> :: class
  • Constructor pnetworkingeterminado para IntentService (kotlin)
  • Cómo cambiar el nombre de una propiedad de Kotlin para que coincida con el campo en la database de Firebase
  • `break` y` continue` en `forEach` en Kotlin
  • Error: ejecución fallida para la tarea ': app: kaptDemoTestingDebugKotlin'
  • Android: Usando viewPager con navigationDrawer - problema con Fragments
  • Selecciones no deseadas en RecyclerView