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)) 
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • Quiero cambiar el background después de hacer clic en Botón en Android con Kotlin
  • Android Studio (Kotlin) GsonBuilder.registerTypeAdapter () da 2 errores
  • Kotlin runtime jar vs kotlin stdlib jar
  • ¿Por qué los texts no cambian en actividad?
  • Android - ViewDataBinding.inflate no infla la vista personalizada anidada
  • ¿Cuál es la razón para usar el sufijo "Kt" en las classs de Kotlin?
  • En android kotlin utilizando la biblioteca paso a paso pasando los valores de botones de opción personalizados sobre múltiples fragments para ser usados ​​en una página de resumen
  • ¿Cómo deserializar ThreeTen LocalDateTime en Retrofit?
  • No tiene administrador activo ... - bloqueando una pantalla en Android
  • Referencia de propiedad anidada Kotlin