Java 在Kotlin中,如何转换Int?到整数

Java 在Kotlin中,如何转换Int?到整数,java,nullable,kotlin,Java,Nullable,Kotlin,我在Kotlin中使用了一个HashMap,当我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 (fibM

我在Kotlin中使用了一个
HashMap
,当我
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
    }
}
val-fibmoom:Map=HashMap()
有趣的fibN(n:Int):Int{
如果(n==0 | | n==1)返回1
if(fibMemo.containsKey(n))
//此处错误:类型不匹配:推断的类型为Int?但应为Int
返回fibMemo.get(n)?.toInt()
否则{
val newNum:Int=fibN(n-1)+fibN(n-2)
fibMemo.put(n,newNum)
返回newNum
}
}

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

违规行应如下所示:

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


警告:上述信息不再有效<代码>确定已替换为
。请参阅:

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

您可以通过使用显式的
null
检查包围对
get
的调用,或者通过调用

IDEA将把
用作Int
的变通方法标记为不安全的强制转换警告,因此不建议使用。

您还可以使用函数避免包含/放入代码。看

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) }
}
val fibMemo=HashMap()
fun fibN(n:Int):Int=when{
n<0->抛出IllegalArgumentException(“fib不适用于$n”)
n==0,n==1->1
else->fibMemo.getOrPut(n){fibN(n-1)+fibN(n-2)}
}

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

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


这个问题也可以通过对空性问题的惯用处理来回答:

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

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

您可以在这里参考有关空安全类型转换的更多信息:

简短的回答是您不能,除非您向编译器强调
可空int
不能也不会通过使用两个感叹号或
if语句
而成为空int
;因为
int
int?

val nullableInt: Int? = 1
val nonNullableInt: Int = nullableInt!! // asserting and smart cast
这里有一个例子

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

x=y // No error
y=x // Error
y=x!! // No error

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

val int:int
val nullableInt:Int?=无效的

int=nullableInt?:0

那么如何使用
int
的映射?我总是在映射中插入不可为null的int,因此它们保证不为null。此外,我希望为Euler项目做出贡献,并可能增加一些std libs。正如您可能已经了解到的,依赖
sure()
的缺点是在运行时会失去null安全性。但是,由于您确定总是将键映射到非空值,因此不管怎样,都应该继续使用
sure()
。至于帮助解决Project Euler(PE)问题,我的理解是,PE站点管理员强烈反对协作,而是鼓励人们单独探索每个问题背后的数学概念。我对问题的数学含义不感兴趣,(我以前解决过其中的一个问题)我感兴趣的是为该语言创建一个很好的参考,并为其开发做出贡献。顺便说一下,这个示例表明,即使map.contains(n)为true,在多线程环境中,map.get(n)也可能导致空值。为什么不将答案更改为当前值并删除
.sure()
完全回答,因为当前Kotlin的答案完全错误。对于Kotlin,有更新的答案是最新的。此问题现在由更新和完整的答案回答:在该问题接受答案和投票后,此问题应作为该问题的副本关闭。在meta.stackexchange.com中,一个现代化问题和答案的推荐方法是创建一个新问题和答案,然后关闭旧问题和答案,同时添加对新问题和答案的引用。
val x:Int? = 1
val y: Int =2

x=y // No error
y=x // Error
y=x!! // No error