Подтвердить что ты не робот

В Kotlin Как я могу преобразовать Int? к Int

Я использую HashMap<Int, Int> в Kotlin, и когда я get, из него возвращается тип Int?.

Как преобразовать Int? в Int?

До сих пор я пытался использовать Int?.toInt(), но, похоже, возвращает Int?.

Я пишу функцию Fibonacci, и мой код выглядит следующим образом:

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
    }
}
4b9b3361

Ответ 1

Прямой ответ, используйте !! Оператор, утверждающий, что вы доверяете значению, НЕ является нулевым и, следовательно, меняет его тип на ненулевой эквивалент. Простой пример, показывающий утверждение, разрешающее преобразование (которое применимо к любому допускаемому типу обнуляемому типу, а не только к Int?)

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

Другой способ преобразовать значение - проверка на ноль. Не полезно в приведенном выше коде, но в другом коде (см. Проверка на нулевое значение в условиях):

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

На эти вопросы также отвечает идиоматический подход к вопросу об обнуляемости: в Kotlin, каков идиоматический способ иметь дело с обнуляемыми значениями, ссылаться на них или преобразовывать их

Ответ 2

Чтобы преобразовать Int? в Int, используйте метод sure().

Оскорбительная строка должна выглядеть так:

return fibMemo.get(n).sure()

Вызов метода sure() - это метод Kotlin (который вскоре будет заменен специальной конструкцией языка) для обеспечения непустоты. Поскольку Java не имеет обозначений типов с нулевым и непустым значением, нам нужно проявлять осторожность в точке интеграции. Пожалуйста, прочитайте удивительную историю нулевой безопасности в документации Котлина.

источник

Предупреждение: приведенная выше информация больше не выполняется. sure был заменен на !!. См.: http://blog.jetbrains.com/kotlin/migrating-sure/

Ответ 3

В дополнение к проверке наличия ключа вам также необходимо убедиться, что возвращаемое значение не равно null, поскольку java.util.HashMap допускает значения null.

Вы можете сделать это, либо связав свой вызов с get с явным тегом null, либо вызвав !! по возвращаемому значению.

Ваше обходное решение для использования as Int будет помечено как предупреждение о небезопасном нажатии на IDEA, и поэтому не рекомендуется.

Ответ 4

Вы также можете использовать getOrPut, чтобы избежать добавления/размещения в вашем коде. См

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) }
}

Ответ 5

Самый простой способ - использовать нулевую проверку

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

Вы можете более подробно рассказать о нулевых типах: Null Safety - Kotlin

Ответ 6

Короткий ответ вы не можете, если вы не решите указать компилятору, что nullable int не может и не будет null, используя два восклицательных знака или через использование if statement; потому что int является subtype of int?

Вот пример.

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

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

Ответ 7

Вы также можете использовать значение по умолчанию в пустом случае:

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