Java 在Kotlin中,如何转换Int?到整数
我在Kotlin中使用了一个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
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