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

时间:2012-03-05 06:04:11

标签: java nullable kotlin

我在Kotlin中使用HashMap<Int, Int>,当我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
    }
}

7 个答案:

答案 0 :(得分:18)

直接回答,使用!! operator断言您信任某个值是非null,因此将其类型更改为非null等效值。一个简单的示例,显示允许转换的断言(适用于任何可空类型,而不仅仅是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

答案 1 :(得分:8)

要将Int?转换为Int,请使用sure()方法。

违规行应如下所示:

return fibMemo.get(n).sure()
  

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

source

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

答案 2 :(得分:2)

除了检查是否存在密钥外,您还需要确保返回的值不是null,因为java.util.HashMap允许null值。

您可以通过明确的get检查来调用null,或者在返回的值上调用!!来执行此操作。

使用as Int的解决方法将被IDEA标记为不安全的投射警告,因此不建议。

答案 3 :(得分: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) }
}

答案 4 :(得分:2)

最简单的方法是使用空检查

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

答案 5 :(得分:1)

简短的回答是 你不能 ,除非你强烈地向编译器说明nullable int不能而且不会{{1通过使用两个感叹号或通过使用null;因为if statementint

subtype

这是一个例子。

int?

答案 6 :(得分:1)

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

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