Dans Kotlin Comment puis-je Convertir un Int? pour un Int
Je suis en utilisant un HashMap<Int, Int>
dans Kotlin et quand je get
hors de lui le type de retour est Int?
.
Comment puis-je convertir des Int?
à un Int
?
Jusqu'à présent, j'ai essayé d'utiliser Int?.toInt()
, mais qui semble être de retour un Int?
.
Je suis en train d'écrire une fonction de Fibonacci, et mon code ressemble à ceci:
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
}
}
- Il y a de nouvelles réponses qui sont en cours de Kotlin.
- Cette question est maintenant de répondre par la plus à jour et plus complet: stackoverflow.com/questions/34498562 Après que la question a accepté de répondre et de votes, ce qui devrait être fermée, comme un double de cette. Dans meta.stackexchange.com une méthode recommandée pour moderniser les questions et les réponses, c'est pour en créer un nouveau, puis fermez l'ancien tout en y ajoutant une référence à la nouvelle.
Vous devez vous connecter pour publier un commentaire.
La réponse directe, l'utilisation de la
!!
opérateur d'affirmer que vous faites confiance à une valeur n'est PAS null et donc de changer son type à la non nul équivalent. Un exemple simple montrant l'affirmation permettant la conversion (qui s'applique à tout type nullable, pas seulementInt?
)Un autre moyen de convertir une valeur via un null vérifier. Pas utile dans votre code ci-dessus, mais dans un autre code (voir La vérification de la valeur null dans les conditions):
Ces questions sont également traitées par la idiomatiques traitement de la possibilité de valeur null question: Dans Kotlin, qu'est-ce que le idiomatiques façon de traiter avec nullable valeurs, de référencement ou de les convertir
Afin de convertir un
Int?
à unInt
utiliser lesure()
méthode.La ligne incriminée doit ressembler à:
source
Avertissement: les informations ci-dessus ne tient plus.
sure
a été remplacé par!!
. Voir: http://blog.jetbrains.com/kotlin/migrating-sure/.sure()
répondre entièrement, car il est complètement faux pour le courant de Kotlin.Vous pouvez également utiliser getOrPut fonction pour éviter les contient/mettez dans vous code. Voir
En plus de vérifier la présence de la clé, vous aurez également besoin de s'assurer que la valeur retournée n'est pas
null
commejava.util.HashMap
permetnull
valeurs.Vous pouvez le faire soit en entourant votre appel à
get
explicitenull
chèque ou en invoquant!!
sur la valeur retournée.Votre solution de contournement pour utiliser
as Int
sera signalé comme dangereux fonte d'avertissement par l'IDÉE, et n'est donc pas conseillé.Int
alors? Je suis toujours à l'insertion non nullable ints dans la carte, de sorte qu'ils sont garantis afin de ne pas être null.sure()
est que vous perdez la valeur null à la sécurité lors de l'exécution. Cependant, puisque vous êtes certain que vous êtes toujours le mappage des touches non null valeurs, vous devriez aller de l'avant et à l'utilisationsure()
indépendamment.!!
dans votre réponse, car elle ne fait pas partie de Kotlin pendant des années.Le plus simple est d'utiliser une valeur null vérifier
Vous pouvez consulter plus sur null-Type sécurité jette ici : Null Sécurité - Kotlin
La réponse courte est vous ne pouvez pas à moins de vous assurer de l'état au compilateur que la
nullable int
ne peut pas et ne sera pasnull
grâce à l'utilisation de deux points d'exclamation ou par l'utilisation d'unif statement
; carint
est unsubtype
deint?
Ici est un exemple.
Vous pouvez également utiliser une valeur par défaut à null cas:
val int: Int
val nullableInt: Int? = null
int = nullableInt ?: 0