在Kotlin我如何转换Int?到国际

jjn*_*guy 26 java nullable kotlin

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Jay*_*ard 25

直接回答,使用!!运算符断言您信任某个值是非null,因此将其类型更改为非null等效值.一个简单的示例,显示允许转换的断言(适用于任何可空类型,而不仅仅是Int?)

val nullableInt: Int? = 1
val nonNullableInt: Int = nullableInt!! // asserting and smart cast
Run Code Online (Sandbox Code Playgroud)

转换值的另一种方法是通过空检查.在上面的代码中没有用,但在其他代码中没有用(请参阅在条件中检查null):

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

这个问题也可以通过对可空性问题的惯用处理来回答:在Kotlin中,处理可空值,引用或转换它们的惯用方法是什么?


jjn*_*guy 9

为了将转换Int?Int使用sure()方法.

违规行应如下所示:

return fibMemo.get(n).sure()
Run Code Online (Sandbox Code Playgroud)

调用方法sure()是Kotlin方式(很快将被特殊语言构造取代)以确保不可空性.由于Java没有可空和非可空类型的表示法,我们需要注意集成点.请阅读Kotlin文档中关于零安全的惊人故事.

资源

警告:上述信息不再存在.sure已被取代!!.请参阅:http://blog.jetbrains.com/kotlin/migrating-sure/

  • 为什么不将答案改为最新并完全放弃`.sure()`答案,因为它对于当前的Kotlin来说是完全错误的. (2认同)

Chu*_*uck 6

您还可以在 null 情况下使用默认值:

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