type number float declarar arrayof array java nullable kotlin

java - number - En Kotlin ¿Cómo puedo convertir un Int? a un int



kotlin decimal type (7)

Estoy usando un HashMap<Int, Int> en Kotlin y cuando salgo de él, ¿el tipo de retorno es Int? .

¿Cómo puedo convertir el Int? a un Int ?

Hasta ahora he intentado usar Int?.toInt() , pero ¿parece que está devolviendo un Int? .

Estoy escribiendo una función de Fibonacci, y mi código se ve así:

val fibMemo : Map<Int, Int> = HashMap<Int,Int>() fun fibN(n:Int) : Int { if (n == 0 || n == 1) return 1 if (fibMemo.containsKey(n)) // Error here: Type mismatch: inferred type is Int? but Int was expected return fibMemo.get(n)?.toInt() else { val newNum : Int = fibN(n-1) + fibN(n-2) fibMemo.put(n, newNum) return newNum } }


¿Para convertir un Int? Para un Int use el método sure() .

La línea ofensiva debe verse como:

return fibMemo.get(n).sure()

La llamada al método sure() es a la manera de Kotlin (que pronto será reemplazada por un lenguaje especial) para garantizar la no nulabilidad. Como Java no tiene notación de tipos anulables y no anulables, debemos tener cuidado en el punto de integración. Por favor, lea la asombrosa historia de seguridad nula en la documentación de Kotlin.

source

Advertencia : la información anterior ya no es válida. sure ha sido reemplazado por !! . Consulte: http://blog.jetbrains.com/kotlin/migrating-sure/


Además de verificar la presencia de la clave, también deberá asegurarse de que el valor devuelto no sea null ya que java.util.HashMap permite valores null .

Puede hacerlo rodeando su llamada para get un cheque null explícito o invocando !! en el valor devuelto.

Su solución para usar as Int marcará como una advertencia de lanzamiento no seguro por IDEA, y por lo tanto no es aconsejable.


La forma más fácil es usar un cheque nulo.

var a : Int? = 12 var b : Int b = a // error! b = if(a != null) a else -1 //automatic typecast from Int? to Int

Puede consultar más información sobre los moldes tipo null-safe aquí: Null Safety - Kotlin


La respuesta corta es que no puede, a menos que declare enfáticamente al compilador que el nullable int no puede y no será null mediante el uso de dos signos de exclamación o mediante el uso de una if statement ; porque int es un subtype de int?

Aquí hay un ejemplo.

val x:Int? = 1 val y: Int =2 x=y // No error y=x // Error y=x!! // No error


La respuesta directa, usa el !! El operador afirma que confía en que un valor NO es nulo y, por lo tanto, cambia su tipo al equivalente no nulo. Una muestra simple que muestra la aserción que permite la conversión (que se aplica a cualquier tipo de nullable, no solo Int? )

val nullableInt: Int? = 1 val nonNullableInt: Int = nullableInt!! // asserting and smart cast

Otra forma de convertir un valor es a través de un cheque nulo. No es útil en su código anterior, pero en otro código (consulte Comprobación de condiciones nulas ):

val nullableInt: Int? = 1 if (nullableInt != null) { // allowed if nullableInt could not have changed since the null check val nonNullableInt: Int = nullableInt }

A esta pregunta también se responde el tratamiento idiomático de la nulabilidad. Pregunta: En Kotlin, ¿cuál es la forma idiomática de tratar los valores que aceptan valores nulables, al referenciarlos o convertirlos?


También puede usar la función getOrPut para evitar que contenga / ponga en su código. Ver

val fibMemo = HashMap<Int, Int>() fun fibN(n: Int): Int = when { n < 0 -> throw IllegalArgumentException("fib is not applicable to $n") n == 0, n == 1 -> 1 else -> fibMemo.getOrPut(n) { fibN(n - 1) + fibN(n - 2) } }


También puede utilizar un valor predeterminado en caso nulo:

val int: Int val nullableInt: Int? = null int = nullableInt ?: 0