ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
Kotlinにおいて、型チェックを実施したブロック内で自動的にその型に型キャストされる機能。
例えば、あるオブジェクトが特定のインターフェイスを持っていた場合にそれを実行する場合、オブジェクトがインターフェイスを持っているか確認した後、更にキャストをしなければ通常はそのインターフェイスのメソッドを実行できない。これはJavaなど他の言語も同様である。
また、nullableな変数は、?または!!の糖衣構文を用いなければ、同様にプロパティの参照もメソッドの実行もできない。
しかしこういった場合でも、ifで型チェックを実施したブロック内であれば、明示的なキャストを省略することができる。つまりそのブロック内では自動的に型のチェックとキャストが同時実行されている。このkotlinの言語機能がスマートキャストである。
例えば、次のようなinterfaceが定義されていたとする。
interface Hoge { fun hogehoge() }
関数がオブジェクトを受け取ってそれを確認し、実行する場合、他の言語と同様に書けば次のようになるだろう。
fun test(obj: Any) { if (obj is Hoge) { val hoge = obj as Hoge hoge.hogehoge() } }
しかしKotlinにおいてこの書き方は冗長である。
ifブロック内ではスマートキャストされているため、次のように書くことができる。
fun test(obj: Any) { if (obj is Hoge) { obj.hogehoge() } }
nullableな変数は、?または!!の糖衣構文を用いなければビルドエラーとなり、プロパティの参照もメソッドの実行もできない。
例えばnullableなオブジェクトobjのメソッドhogehoge()を実行するなら、通常は次のいずれかでないとビルドが通らない。
obj?.hogehoge() obj!!.hogehoge()
そこでobj?.let { ... } といったスコープ関数が使われることも多いが、Kotlinではifでnullかどうか判断された場合、そのifブロック内はスマートキャストされnon-nullに仮定されるため?も!!も不要となる。
if (obj == null) { obj.hogehoge() }
もちろん?または!!を使っていてもエラーではないが、冗長である。
Kotlinの式の演算は、CやJavaなどと同様に左から右の順に評価される。このため一つの式中に&&や||で複数の演算があった場合、左側で評価されていれば、以降は自動的にスマートキャストされる。
従って、次のような書き方が可能である。
if (hoge is String && hoge.length > 0) { println(hoge.length) } if (hoge !is String || hoge.isEmpty()) { return }
コメントなどを投稿するフォームは、日本語対応時のみ表示されます