2012-03-05 2 views
13

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

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

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

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

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

Есть более новые ответы, которые являются текущими для Kotlin. –

+1

Этот вопрос сейчас ответил больше и больше: http://stackoverflow.com/questions/34498562 После того, как этот вопрос принял ответ и голосует, его следует закрыть как дубликат. В meta.stackexchange.com рекомендуемым способом модернизации вопросов и ответов является создание нового, а затем закрытие старого при добавлении ссылки на новое. –

ответ

7

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

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

Другим способ для преобразования значения осуществляется через нулевую проверку.Не полезно в коде выше, но в другом коде (см 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 
} 

Это вопросы также отвечают фразеологическому лечение допустимости пустого вопроса: In Kotlin, what is the idiomatic way to deal with nullable values, referencing or converting them

8

Для того, чтобы преобразовать Int? к Int использовать метод sure().

Нарушитель строка должна выглядеть так:

return fibMemo.get(n).sure() 

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

source

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

+0

Кстати, этот пример показывает, что даже если map.contains (n) истинно, в многопоточной среде map.get (n) может привести к нулевому значению. –

+2

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

2

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

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

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

+0

Как я могу использовать карту 'Int' тогда? Я всегда вставляю в карту не-nullable ints, поэтому они гарантированно будут не-null. – jjnguy

+0

Кроме того, я хотел бы внести свой вклад в проект Euler и, возможно, увеличить некоторый flog std libs. – jjnguy

+0

обновил мой ответ, он выглядит лучше? – jjnguy

2

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

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

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

1

ВГ орт ответ вы не, если вы категорически не заявить компилятору, что 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 
Смежные вопросы