btpb5hmlur.png

はじめに

 

前回は、はじめてのKotlinの文法:enumについて学習しました。今回はKotlinの文法:スマートキャストついて説明していきます。以下は前回までの記事です。

第2章:Kotlinの文法

 
2.1 変数
 
2.2 関数
2.3 データ型
2.4 配列
2.5 コレクション
2.6 制御構文
2.7 範囲
2.8 Null安全
2.9 等価性
2.10 パッケージとインポート
2.11 enum
2.12 スマートキャスト(Smart cast)
 

今回はKotlinのスマートキャストの機能について説明します。Kotlinは、Flow-Sensitive Typeと呼ばれる型システムを持っています。制御フローによってある変数や式の型が変わる型システムの総称のことで、Kotlinではスマートキャスト(Smart cast)と呼んでいます。

 

■2.12.1  スマートキャストの使用方法

 

通常、安全なキャストなしでnull許容型のStringにアクセスしようとすると、コンパイルエラーが発生します。

 

var message: String? = "Hello!"
    print(message.length) // コンパイルエラー

 

上記の式を解くために、スマートキャスト(Smart cast)を使います。

 

var message: String? = "Hello!"
    if(message != null) { // スマートキャスト
        print(message.length) // プロパティにアクセス可能
    }
}

 

ifの条件式でnullチェックをすることにより、その中ではnot-nullableな型として扱うことができます。

 

Javaでは、キャストを行う場合、instanceof演算子を使用し、ダウンキャストを行います。

 

// Java
Animal animal = new Cat();

if (animal instanceof Cat) {
  Cat cat = (Cat)animal; // ダウンキャスト
  cat.catMethod(); // `Cat` のメソッドを使う処理
}

 

一度instanceofでanimalがCatであると確認したにも関わらず、その後 Cat へのダウンキャストが必要になります。直前の if 文で animal が Cat であることを確認しているのに、明示的にキャストしなければならないのは冗長です。

 

Kotlinではスマートキャスト(Smart cast)により、animalは自動的にCatにキャストされます。

 

//Kotlin
val animal = Cat()

if (animal is Cat) { // Smart Cast
  animal.catMethod() // `Cat` のメソッドを使う処理
}

 

when文を使うことで、更にスマートキャストを活用できます。

 

val list: List<Any> = listOf('a', 3, "abc", true)

for (e in list) {
    val result: Any? = when(e) {

        is Int -> e + 3
        is String -> e.toUpperCase()
        is Char -> e
        is Boolean -> e.not()
        else -> null
    }

    println(result)
}

 

おわりに

いかがでしょうか。Javaではキャストの際にinstanceof演算子を使用し、ダウンキャストを行っておりましたが、Kotlinではスマートキャストを利用してまさにスマートにキャストを行うことができました。

 

お次は、例外について説明します。

お知らせ

 

ブログ情報

 

プロマリのブログで昨日7月26日(金)気になるNews記事をまとめてみました。皆様も面白いニュースがありましたら教えてくださいね。


written by たみと@プロマリ