簡體   English   中英

在Kotlin我如何轉換Int?到國際

[英]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 ; 因為intintsubtype 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM