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