38

私はHashMap<Int, Int>Kotlin で a を使用していますが、それを使用しないとき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
    }
}
4

7 に答える 7

36

直接的な答えは、!!演算子を使用して、値が NOT null であると信頼していることを表明するため、その型を null 以外の同等のものに変更することです。変換を許可するアサーションを示す簡単なサンプル (これは だけでなく、null 許容型に適用されますInt?)

val nullableInt: Int? = 1
val nonNullableInt: Int = nullableInt!! // asserting and smart cast

値を変換するもう 1 つの方法は、null チェックを使用することです。上記のコードでは役に立ちませんが、他のコードでは役に立ちません (条件内の null のチェックを参照してください):

val nullableInt: Int? = 1
if (nullableInt != null) {
   // allowed if nullableInt could not have changed since the null check
   val nonNullableInt: Int = nullableInt
}

この質問は、null 可能性の質問の慣用的な扱いによっても回答されます。Kotlin では、null 可能な値を参照または変換する慣用的な方法

于 2015-12-28T16:38:40.227 に答える
11

を に変換するInt?Intは、 メソッドを使用しsure()ます。

問題のある行は次のようになります。

return fibMemo.get(n).sure()

メソッドの呼び出しsure()は Kotlin 方式 (特別な言語構造に間もなく置き換えられる予定) であり、null 非許容性を保証します。Java には null 許容型と非 null 許容型の表記がないため、統合点に注意する必要があります。Kotlin のドキュメントで null 安全性の驚くべき話を読んでください。

ソース

警告: 上記の情報はもはや当てはまりません。sureに置き換えられました!!。参照: http://blog.jetbrains.com/kotlin/migrating-sure/

于 2012-03-05T06:11:38.410 に答える
4

最も簡単な方法は、null チェックを使用することです

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

ここで null-safe Type キャストの詳細を参照できます: Null Safety - Kotlin

于 2017-05-20T01:12:21.250 に答える
3

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) }
}
于 2015-11-12T10:36:20.123 に答える