2012-03-05 16 views
13

Sto utilizzando un HashMap<Int, Int> in Kotlin e quando I get il tipo restituito è Int?.In Kotlin Come posso convertire un Int? a un numero

Come posso convertire lo Int? in uno Int?

Finora ho provato a utilizzare Int?.toInt(), ma questo sembra restituire un Int?.

che sto scrivendo una funzione di Fibonacci, e il mio codice è simile:

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

ci sono risposte più recenti che sono in corso per Kotlin. –

+1

Questa domanda ha ora una risposta più attuale e completa: http://stackoverflow.com/questions/34498562 Dopo che la domanda ha accettato risposta e voti, questo dovrebbe essere chiuso come duplicato di quello. In meta.stackexchange.com un modo consigliato per modernizzare le domande e le risposte è crearne uno nuovo, quindi chiudere il vecchio aggiungendo un riferimento al nuovo. –

risposta

7

La risposta diretta, utilizzare il !! operator per affermare che vi fidate di un valore non è nullo e quindi cambiare il tipo all'equivalente non nullo. Un semplice esempio che mostra l'asserzione che consente la conversione (che si applica a qualsiasi tipo annullabile, non solo Int?)

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

Un altro modo per convertire un valore tramite un controllo nullo.Non è utile nel codice sopra, ma in altro codice (vedi 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 
} 

Questa domanda è anche risposta dal trattamento idiomatica della domanda nullability: In Kotlin, what is the idiomatic way to deal with nullable values, referencing or converting them

8

Per convertire un Int? a un Int utilizzare il metodo sure().

La linea incriminata dovrebbe assomigliare:

return fibMemo.get(n).sure() 

Chiama per il metodo sure() è il modo Kotlin (che sarà presto sostituito da speciali costrutto del linguaggio) per garantire la non-valori Null. Poiché Java non ha notazione di tipi nullable e non annullabili, è necessario fare attenzione al punto di integrazione. Si prega di leggere la straordinaria storia di null-safety nella documentazione di Kotlin.

source

Attenzione: le informazioni di cui sopra non regge più. sure è stato sostituito da !!. Vedere: http://blog.jetbrains.com/kotlin/migrating-sure/

+0

A proposito, questo esempio mostra che anche se map.contains (n) è true, in ambiente multithread, map.get (n) può dare come risultato un valore nullo. –

+2

Perché non cambiare la risposta per essere corrente e rilasciare la risposta '.sure()' poiché è completamente sbagliata per l'attuale Kotlin. –

2

Oltre a controllare la presenza della chiave, sarà necessario anche per garantire che il valore restituito non è null come java.util.HashMap permette null valori.

si può fare che da una che circonda la chiamata a get con un esplicito null assegno o invocando !! sul valore restituito.

La soluzione alternativa per utilizzare as Int verrà contrassegnata come avviso di avviso non sicuro da IDEA, pertanto non è consigliabile.

+0

Come posso usare una mappa di 'Int' allora? Inserisco sempre valori non nulli nella mappa, quindi sono garantiti come non nulli. – jjnguy

+0

Inoltre, mi piacerebbe contribuire al progetto Eulero e forse aumentare le librerie std. – jjnguy

+0

aggiornato la mia risposta, sembra migliore? – jjnguy

2

È inoltre possibile utilizzare la funzione getOrPut per evitare di contenere/inserire il proprio codice. Vedere

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

Il modo più semplice è quello di utilizzare un controllo di nulla

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

È possibile fare riferimento più su tipo null-sicuro calchi qui: Null Safety - Kotlin

1

La sh ort risposta è non a meno che affermare con forza al compilatore che la nullable int non può e non essere null attraverso l'uso di due punti esclamativi o attraverso l'uso di un if statement può; perché è un subtype di int?

Ecco un esempio.

val x:Int? = 1 
val y: Int =2 

x=y // No error 
y=x // Error 
y=x!! // No error 
Problemi correlati