web-dev-qa-db-ja.com

KotlinでIntを変換するにはどうすればよいですか? Intに

私はKotlinで_HashMap<Int, Int>_を使用しており、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
    }
}
_
32
jjnguy

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

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

値を変換する別の方法は、nullチェックを使用することです。上記のコードでは役に立たないが、他のコードでは( 条件でのnullのチェック を参照):

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

この質問は、ヌル可能性の質問の慣用的な扱いによっても答えられます: Kotlinでは、ヌル値を参照、変換するための慣用的な方法は何ですか

22
Jayson Minard

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

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

_return fibMemo.get(n).sure()
_

メソッドsure()への呼び出しはKotlinの方法であり(すぐに特殊な言語構造に置き換えられます)、nullを許容しないようにします。 Javaにはnull許容型とnull不可型の表記がないため、統合ポイントに注意する必要があります。Kotlinのドキュメントでnullの安全性に関する驚くべき話を読んでください。

ソース

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

8
jjnguy

最も簡単な方法は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セーフな型キャストの詳細については、こちらを参照してください。 Null Safety-Kotlin

2
JavaBanana

getOrPut 関数を使用して、コード内のcontains/putを回避することもできます。見る

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) }
}
2
Sergey Mashkov

キーの存在を確認することに加えて、Java.util.HashMapnull値を許可するため、戻り値がnullではないことを確認する必要もあります。

getへの呼び出しを明示的なnullチェックで囲むか、戻り値に対して!!を呼び出すことにより、これを行うことができます。

as Intを使用するための回避策は、IDEAによって安全でないキャスト警告としてフラグが付けられるため、お勧めできません。

2
Franck Rasolo

短い答えはすることはできませんコンパイラにnullable intができないことを強調しない限り2つの感嘆符を使用したり、if statementを使用したりしても、nullにはなりません。 intsubtype of int?であるため

例を示します。

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

x=y // No error
y=x // Error
y=x!! // No error
1
Alf Moh

Nullの場合はデフォルト値を使用することもできます。

val int: Int val nullableInt: Int? = null int = nullableInt ?: 0

1
Chuck