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

Я использую HashMap<Int, Int> в Kotlin, и когда я выхожу из него, возвращаемый тип – 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 } } 

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

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

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

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

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

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

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

 return fibMemo.get(n).sure() 

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

источник

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

Вы также можете использовать функцию 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) } } 

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

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

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

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

 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

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

Вот пример.

 val x:Int? = 1 val y: Int =2 x=y // No error y=x // Error y=x!! // No error 
Intereting Posts
Как использовать Realm в библиотеке обрабатывать объект, который может возвращать значение null в kotlin Пользовательский диалог Kotlin Параметр, заданный как непустой Kotlin anko onclick – нерешенная ссылка Как заставить безопасных строителей Kotlin работать в Scala? FirebaseRecyclerAdapter – populateViewHolder не получает доступ к данным Android Kotlin – Невозможно планировать уведомление для будущей даты с помощью диспетчера аварийных сигналов Kotlin: преобразовать большой список в подсписку заданного размера раздела Могу ли я создать KType из reified T Как получить все подклассы данного закрытого класса? Kotlin: метод не может использоваться с дженериками Kotlin: Как я могу избежать автобоксинга (мусора) в делегированных свойствах? Устаревший Kotlin Runtime Наблюдаемое свойство, позволяющее добавлять наблюдателей во время выполнения Отключить просмотр прокрутки пейджера Viewpager в Котлине