38

HashMap<Int, Int>在 Kotlin 中使用 a ,当我get退出它时,返回类型是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
    }
}
4

7 回答 7

36

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

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

于 2015-12-28T16:38:40.227 回答
11

为了将一个转换Int?为一个Int使用该sure()方法。

违规行应如下所示:

return fibMemo.get(n).sure()

调用方法sure()是 Kotlin 的方式(很快就会被特殊的语言结构取代),以确保不可为空。由于 Java 没有可空和不可空类型的表示法,我们需要注意集成点。请阅读 Kotlin 文档中关于 null-safety 的精彩故事。

来源

警告:以上信息不再有效。sure已被替换!!。请参阅:http ://blog.jetbrains.com/kotlin/migrating-sure/

于 2012-03-05T06:11:38.410 回答
7

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

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

于 2019-01-10T16:34:36.323 回答
4

除了检查键是否存在,您还需要确保返回的值不是null允许java.util.HashMapnull值。

您可以通过使用get显式null检查或调用!!返回值来包围您的调用来做到这一点。

您使用的解决方法as Int将被 IDEA 标记为不安全的强制转换警告,因此不建议使用。

于 2012-03-05T08:55:29.043 回答
4

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

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

您可以在此处参考更多关于 null 安全类型转换的信息:Null Safety - Kotlin

于 2017-05-20T01:12:21.250 回答
3

您还可以使用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) }
}
于 2015-11-12T10:36:20.123 回答
3

简短的回答是你不能,除非你向编译器强调nullable int不能也不会null通过使用两个感叹号或通过使用if statement; 因为intsubtype一个int?

这是一个例子。

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

x=y // No error
y=x // Error
y=x!! // No error
于 2017-06-05T16:51:42.343 回答