2012-03-05 28 views
13

Estoy usando un HashMap<Int, Int> en Kotlin y cuando yo get fuera de él, el tipo de devolución es Int?.En Kotlin ¿Cómo puedo convertir un int? a un Int

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

Hasta ahora he intentado usar Int?.toInt(), pero eso parece devolver un Int?.

estoy escribiendo una función de Fibonacci, y mi código es el siguiente:

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

Hay respuestas más recientes que son actuales para Kotlin. –

+1

Esta pregunta ahora está respondida por la más actual y completa: http://stackoverflow.com/questions/34498562 Después de que la pregunta haya aceptado la respuesta y los votos, esta debe cerrarse como duplicada de eso. En meta.stackexchange.com, una forma recomendada de modernizar preguntas y respuestas es crear una nueva, y luego cerrar la anterior al agregar una referencia a la nueva. –

Respuesta

7

La respuesta directa, utilice el !! operator afirmar que confía en un valor no es nulo y por lo tanto cambiar su tipo al equivalente no nulo. Una muestra simple que muestra la afirmación de que permite la conversión (que se aplica a cualquier tipo anulable, no sólo Int?)

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

Otra manera de convertir un valor es a través de un cheque nulo.No es útil en el código anterior, pero en otro tipo de código (ver Checking for null in conditions):

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

Esta pregunta también es contestada por el tratamiento idiomático de la pregunta nulabilidad: In Kotlin, what is the idiomatic way to deal with nullable values, referencing or converting them

8

Con el fin de convertir un Int? a un Int usar el método sure().

línea El infractor debe ser similar:

return fibMemo.get(n).sure() 

La llamada al método sure() es Kotlin manera (que pronto será reemplazado por construcción del lenguaje especial) para garantizar la no aceptación de valores NULL. Como Java no tiene anotación de tipos que aceptan nulos y que no aceptan nulos, debemos tener cuidado con el punto de integración. Lea la increíble historia de seguridad nula en la documentación de Kotlin.

source

Advertencia: la información anterior no se sostiene más. sure ha sido reemplazado por !!. Ve: http://blog.jetbrains.com/kotlin/migrating-sure/

+0

Por cierto, este ejemplo muestra que incluso si map.contains (n) es verdadero, en el entorno multiproceso, map.get (n) puede dar como resultado un valor nulo. –

+2

¿Por qué no cambiar la respuesta para ser actual y soltar completamente la respuesta '.sure()' ya que es completamente incorrecto para el Kotlin actual. –

2

Además de comprobar la presencia de la llave, también tendrá que asegurarse de que el valor devuelto no es null como java.util.HashMap permite null valores.

Puede hacerlo rodeando su llamada al get con una comprobación explícita null o invocando !! en el valor devuelto.

Su solución para utilizar as Int será señalada como advertencia de lanzamiento inseguro por IDEA, y por lo tanto no es recomendable.

+0

¿Cómo puedo usar un mapa de 'Int' entonces? Siempre inserto ints que no aceptan nulos en el mapa, por lo que se garantiza que no son nulos. – jjnguy

+0

Además, me encantaría contribuir con el proyecto de Euler y tal vez aumentar algunos flog de las librerías estándar. – jjnguy

+0

actualizó mi respuesta, ¿se ve mejor? – jjnguy

2

También puede usar la función getOrPut para evitar contener/poner 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) } 
} 
1

La forma más sencilla es utilizar 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 tipo de fallos nula arroja aquí: Null Safety - Kotlin

1

El sh ORT respuesta es no menos que enfáticamente estado para el compilador que el nullable int no puede y no puede ser null mediante el uso de dos signos de exclamación o mediante el uso de un if statement pueden; 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