こんにちは。YOSHITAKA(@YOSHITA19704216)です。
- 「as」「 !」「 ?」の使い分けがわかります。
Contents
「as」「 !」「 ?」の意味と使い方
対象者
- kotolin初学者に向けて書いております。
「as」「 !」「 ?」
キャスト(as)や、型や変数の後ろにつける ! 記号、 ? 記号の意味について
「?」はnullable可能 型宣言に?をつける
型宣言に付けた場合は nullableになります。
(Kotlin は明示的に 「?」 を付けないと null を代入できない)
var b : String? = "abc" b = null
変数に?をつける
変数に付けた場合は Safe Call(安全な呼び出し)になります。
b が null じゃない場合にのみ、関数を実行
b が null の場合は null を返す。
var l = b?.length
?: エルピス演算子(Elvis Operator)
?: の左側にくる式の値が null の場合は右側の値を返す。
今回の場合は-1になります。
val l = b?.length ?: -1
!
Java コード呼び出し時の引数や返り値に型の後ろについていて、T!
は T
もしくは ?
を表します。
※ Kotlin コードを書いている際に直接使用することはありません。
例えば Android の Context.getFileStreamPath は IDE の補完機能では context.getFileStreamPath(name : String!) : File!
と表示されますが、! がついていることにより、引数や返り値に nullable な型でもそうでない型でもどちらでも使用できることがわかります。
var p0 : String? = null; var f0 : File? = context.getFileStreamPath(p0) var p1 : String = "" var f1 : File = context.getFileStreamPath(p1)
!!
var l = b!!.length()
b が Null の場合 Null Pointer Exception が発生します。
「as」は アンセーフキャスト
※キャストとは、プログラミングにおいて、あるデータ型の変数を別のデータ型に変換する型変換のことで、ソースコードに記述して行うものを指します。
キャストに失敗した場合は例外が発生します。
明示的なキャスト
// yをStringにキャストするが、キャストできなかったら例外を投げる。
val x: String = y as String
// 上の場合、nullでも例外。nullを許容するにはNullableでないといけない
val a: String? = b as String?
// as? を使うと失敗時に例外を投げずnullを返す。なのでキャスト結果はNullableになる。
val x: String? = y as? String
エラー文章は次のようになります。
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at ******.main(*******.kt:11)
11
キャストに失敗した場合はClassCastExceptionという例外がスローされてしまいます。
例外は適切に処理されなければ不具合のもとになるため、Kotlinではアンセーフキャストと呼ばれています。
「as?」 は セーフキャスト
安全なキャスト。
キャストが失敗した場合は null を返します。
明示的なキャスト
// as? を使うと失敗時に例外を投げずnullを返す。なのでキャスト結果はNullableになる。
val x: String? = y as? String
var aInt : Int? = a as? Int
キャストしようとしてできなかった場合、nullが返ります。
つまり、そもそも適切に処理をしないとビルドエラーになり、実行することができません。
プログラマはコンパイラによって、きちんとnullチェックをすることが強制され、 うっかりによるチェックもれを防ぐことができるので「安全」だということになるようです。
まとめ
今回は「as」「 !」「 ?」 変数の後ろにつける ! 記号、 ? 記号の使い方についてざっくりお伝えしました。
詳しいことは参考に更に書いていますので、ご確認ください。
※プログラミングは習得中ですので、参考程度に記事を読んでください。
参考はこちら