[英]In Kotlin How Can I Convert an Int? to an Int
我使用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
}
}
直接回答,使用!!
運算符斷言您信任某個值是非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) }
}
最簡單的方法是使用空檢查
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
除了檢查密鑰是否存在外,還需要確保返回的值不為null
因為java.util.HashMap
允許null
值。
你可以做到這一點無論是周圍的您的來電get
具有顯式null
支票或通過調用!!
在返回的值上。
as Int
變通方法將被IDEA標記為不安全的強制轉換警告,因此不建議。
簡短的回答是你不能,除非你強烈地告訴編譯器, nullable int
不能通過使用兩個感嘆號或通過使用if statement
而為null
; 因為int
是int
的subtype
int?
這是一個例子。
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? = null int = nullableInt ?: 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.