在Kotlin中如何转换一个Int? 到一个Int
我在Kotlin中使用HashMap<Int, Int>
,当我离开它时,返回类型是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,因此将其类型更改为非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 }
这个问题也可以通过对可空性问题的习惯性处理来回答: 在Kotlin中,处理可空值的惯用方法是什么,引用或转换它们
为了转换一个Int?
到一个Int
使用sure()
方法。
违规行应该是这样的:
return fibMemo.get(n).sure()
调用方法
sure()
是Kotlin方式(很快被特殊语言构造所取代),以确保不可空性。 由于Java没有可空和不可空类型的注释,所以我们需要注意集成点。 请阅读Kotlin文档中的无效安全的惊人故事。
资源
警告 :上述信息不再成立。 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
您可以参考更多关于这里的无效安全类型转换: 空安全性 – Kotlin
简短的回答是,除非你强调地指出编译器可以使用两个惊叹号或通过使用if statement
, nullable int
不能为null
, 因为int
是int
的subtype
int?
这是一个例子。
val x:Int? = 1 val y: Int =2 x=y // No error y=x // Error y=x!! // No error