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)) 
  • Asignación de properties a un object javascript utilizando nombres de properties dinámicas
  • Anima la vista escalando a la altura completa de la pantalla desde su position
  • ¿Por qué el context no tiene el atributo de color primario de la actividad?
  • Referencia no resuelta: campo en Kotlin
  • Dependencia circular cuando se comstack con Kotlin 1.1.2-4, pero no en 1.1.2-3
  • Retorno nulo de la diversión en kotlin
  • Extensiones de Kotlin para Android, los packages no se pueden importar
  • Cómo pasar object personalizado a través de bash en kotlin