スマートキャスト

読み:すまーときゃすと
外語:smart cast 英語
品詞:名詞

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からnon-nullに変わる例

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
}
関連する用語
型キャスト

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club