私は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
}
}
_
直接的な答えは、 !!
演算子 を使用して、値が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では、ヌル値を参照、変換するための慣用的な方法は何ですか
_Int?
_をInt
に変換するには、sure()
メソッドを使用します。
問題のある行は次のようになります。
_return fibMemo.get(n).sure()
_
メソッド
sure()
への呼び出しはKotlinの方法であり(すぐに特殊な言語構造に置き換えられます)、nullを許容しないようにします。 Javaにはnull許容型とnull不可型の表記がないため、統合ポイントに注意する必要があります。Kotlinのドキュメントでnullの安全性に関する驚くべき話を読んでください。
警告:上記の情報はもう保持されません。 sure
は_!!
_に置き換えられました。参照: http://blog.jetbrains.com/kotlin/migrating-sure/
最も簡単な方法は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
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) }
}
キーの存在を確認することに加えて、Java.util.HashMap
はnull
値を許可するため、戻り値がnull
ではないことを確認する必要もあります。
get
への呼び出しを明示的なnull
チェックで囲むか、戻り値に対して!!
を呼び出すことにより、これを行うことができます。
as Int
を使用するための回避策は、IDEAによって安全でないキャスト警告としてフラグが付けられるため、お勧めできません。
短い答えはすることはできませんコンパイラにnullable int
ができないことを強調しない限り2つの感嘆符を使用したり、if statement
を使用したりしても、null
にはなりません。 int
はsubtype
of 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